【发布时间】: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