如何在C#中使用自动延迟绑定



请按照我的代码抢劫:

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

最新更新