c# - C#未运行派生类函数

标签 c# function inheritance

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

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

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

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”代码(或其他任何非标准字段的代码,因为所有字段似乎都是这种情况)

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

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

最佳答案

如果将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
}

关于c# - C#未运行派生类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15889803/

相关文章:

r - 编写以最高相似度匹配列名的代码/函数

c++ - 来自 std::basic_string 的私有(private)继承

c# - 分子 MC 模拟不平衡

c# - C# 中的触发事件会阻止当前线程执行吗?

c# - Entity Framework C# Select 基于方法传入的Predicate

C编程在if条件下传递函数

c++ - 为什么一个线程比调用一个函数更快,mingw

javascript - 继承:如何在重写的方法中模拟 super.method

java - Java 中的继承和方法

c# - 如何获取最大http请求长度时间?