【问题标题】:How to use automatic late binding in C#?如何在 C# 中使用自动后期绑定?
【发布时间】:2017-06-23 06:34:09
【问题描述】:

请查看我的代码:

public class TweenerBase {
    public void Update() {}
}

public class Vector3Tweener : TweenerBase {
    public void Update() { ... }
}

public class ColorTweener : TweenerBase {
    public void Update() { ... }
}

在我调用的另一个类中:

private List < TweenerBase > tweens;

tweens = new List < TweenerBase > ();

ColorTweener tween1 = new ColorTweener();
Vector3Tweener tween2 = new Vector3Tweener();

tweens.Add( tween1 );
tweens.Add( tween2 );

调用时出现问题:

tweens[ 0 ].Update();

它调用:TweenerBase.Update() 不是我预期的 ColorTweener.Update()。我可以用这样的方法修复它:

if ( tweens[ 0 ].type == "ColorTween" ) ( (ColorTween) tweens[ 0 ] ).Update();

但是如果我使用类似的东西,这是非常不方便的解决方案:

( (ColorTween) tweens[ 0 ] ).Update();
float value = ( (ColorTween) tweens[ 0 ] ).GetCurrentValue();
( (ColorTween) tweens[ 0 ] ).SomeAnotherVoid();
( (ColorTween) tweens[ 0 ] ).SomeAnotherVoid2();

看起来不可思议 :) 有没有办法让后期绑定调用只是:

tweens[ 0 ].Update();

它会自动调用 ColorTweener.Update() 吗?

【问题讨论】:

  • 在Java中,方法默认是virtual(并且没有关键字)。如果您想在 C# 中实现相同的目标,则需要将 virtual 添加到 TweenerBase 的声明中(正如其他人所说)。在这种情况下,您的抽象类看起来只有一个空方法。如果你使用 interface 代替,你会这样做,以便从 TweenerBase 继承的东西必须实现它。

标签: c# class late-binding


【解决方案1】:

您需要在基类方法上使用 virtual 并在子类上覆盖它,目前您在子类方法上隐式使用 new 因此在传递基类时调用 update 将调用基类方法.

【讨论】:

    【解决方案2】:

    为什么不让 Update() 函数成为虚拟函数?

    【讨论】:

      【解决方案3】:

      如果你想让派生类的方法隐藏基类的方法,你必须在派生类的方法声明中使用new关键字:

      class derived : base
      {
          public new void method() { }
      }
      

      或者,如果基类只是一个容器,您可以通过它一次操作不同的子类,您可以在基类中将该方法声明为abstract,通过覆盖派生类来提供其实现。

      abstract class base
      { 
          public abstract void method();
      }
      
      class derived : base
      {
          public override void method()
          { // your code }
      }
      

      【讨论】:

        【解决方案4】:

        您应该在基类中使用virtual 关键字,在派生类中使用override 关键字,这样才能按预期工作。

        using System;
        using System.Collections.Generic;
        
        namespace ConsoleApplication
        {
            class Program
            {
                static void Main(string[] args)
                {
                    var tweens = new List<TweenerBase>();
        
                    var tween0 = new TweenerBase();
                    var tween1 = new ColorTweener();
                    var tween2 = new Vector3Tweener();
        
                    tweens.Add(tween0);
                    tweens.Add(tween1);
                    tweens.Add(tween2);
        
                    foreach (var tween in tweens)
                    {
                        tween.Update();
                    }
                }
            }
        
            public class TweenerBase
            {
                /// <summary>
                /// Make sure you mark the base implementation as 'virtual'.
                /// </summary>
                public virtual void Update()
                {
                    Console.WriteLine(nameof(TweenerBase));
                }
            }
        
            public class Vector3Tweener : TweenerBase
            {
                /// <summary>
                /// Make sure to user 'override' keyword to override the base implementation.
                /// </summary>
                public override void Update()
                {
                    Console.WriteLine(nameof(Vector3Tweener));
                }
            }
        
            public class ColorTweener : TweenerBase
            {
                /// <summary>
                /// Make sure to user 'override' keyword to override the base implementation.
                /// </summary>
                public override void Update()
                {
                    Console.WriteLine(nameof(ColorTweener));
                }
            }
        }
        

        这个程序打印出来:

        TweenerBase
        ColorTweener
        Vector3Tweener
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          相关资源
          最近更新 更多