请按照我的代码抢劫:
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((?
您需要在基类方法上使用Virtual并在子类上覆盖它,目前您隐含在子类方法上使用新的,因此在传递基地时调用更新上课将调用基类方法。
为什么您未完成update((函数虚拟?
如果要派生的类方法隐藏基本方法,则必须在派生类的方法声明中使用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 }
}
您应该在基类中使用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