繁体   English   中英

C#未运行派生类函数

[英]C# not running derived class function

我正在制作的游戏有问题。 基本上,我有很多字段,基本类型和其他类型。 从逻辑上讲,我对基本字段进行了派生,以根据需要添加其他功能。

但是,似乎当我调用基类中存在的函数时,该函数将从基类而不是派生类中运行。

这是一些简化代码,因此您可以了解我的意思。

public class Field
{
    public Field(Field exitN, Field exitE, Field exitS, Field exitW, bool barricadeAllowed, int returnTo, int xPos, int yPos)
    {
        //Actual logic is in the constructor, but unrelated to the below function
    }

    public void Function()
    {
        if (this is StartField)
        {
            Debug.WriteLine("StartField running base function!");
        }
        //Actual logic here. 
    }

}

class StartField : Field
{
    public StartField(Field exitN, Field exitE, Field exitS, Field exitW, string color, int xPos, int yPos)
        : base(exitN, exitE, exitS, exitW, false, 0, xPos, yPos)
    {
        //Again, constructor emptied due to unrelatedness. 
    }

    public new void Function()
    {
        Debug.WriteLine("StartField function");
        //Different logic then the base function
    }

在startfield对象上调用此功能会导致“ startfield运行基础函数!”。 出现在我的调试栏中,但没有出现在“ startfield函数”中。这告诉我,即使对象知道它是StartField类型,也仅调用了基本函数。

如果有任何区别,则通过与其他字段的链接保存所有字段。 变量要求类型为Field,但是所有变量都允许(因为继承),这可以通过任何方式导致调用转到“ Field”代码,而不是“ StartField”代码(或任何其他非标准代码)字段,因为似乎所有字段都是这种情况)

我可以想到两种解决方法。我想到的第一种解决方法是在运行函数之前检查类型并将字段强制转换为实际类型。 但是我们不允许在分配中使用(类是Field)。 另外,与简单的函数调用相比,它将需要更多的代码。

第二种解决方法还使用(类是Field)功能,即将所有字段类型的功能编程到基类中。 它不仅使用(类是Field),而且感觉很普通(子级应该有自己的功能,如果基数全部都没有意义,那么最好只使用一个类并将类型作为变量而不是继承成员)

基本上,听起来您需要Function是一个虚拟方法,在StartField对其进行了覆盖

// In Field
public virtual void Function()
{
    if (this is StartField)
    {
        Debug.WriteLine("StartField running base function!");
    }
    //Actual logic here. 
}

// In StartField
public override void Function()
{
    Debug.WriteLine("StartField function");
    //Different logic then the base function
}

您当前的代码使用多态性-如果您正在调用Function的表达式的编译时类型仅为Field ,则它将始终调用Field.Function ,因为它不是虚拟的。 然后,在StartField您明确地说:“我不打算覆盖基本方法-我提供了一个新方法。”

有关new修饰符 ,请参见MSDN页面; 有关virtual修饰符的信息,请参见MSDN页面

如果将Function 虚拟化了怎么办?

public virtual void Function()
{
    if (this is StartField)
    {
        Debug.WriteLine("StartField running base function!");
    }
    //Actual logic here. 
}

然后在StartField重写,如下所示:

public override void Function()
{
    Debug.WriteLine("StartField function");
    //Different logic then the base function
}

绝对不要尝试解决此问题-这是基本的OOP。

您需要将基类方法标记为虚方法(如果没有自己的逻辑,则标记为抽象),以便可以将其覆盖。 然后将子类方法标记为重写。 例如,检查http://msdn.microsoft.com/en-us/library/ebca9ah3(v=vs.110).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM