强制关闭子类型多态对象实例化

本文关键字:多态 对象 实例化 类型 | 更新日期: 2025-04-15 20:01:38

我有以下设置:

public abstract class Parent {
    // logic for class
    public virtual int Value {get;set;}
    public Parent(){}
}
public class Child1 : Parent {
    // child specific logic here
    public Child1 () : base() {
        base.Value = 4;
    }
}
public class Child2 : Parent {
    // child specific logic here
    public Child2 () : base() {
        base.Value = 6;
    }
}
public class RunMe {
    Parent p;
    public Parent instantiateObject(string s) {
        switch(s) {
            case "child1":
                return new Child1();
            break;
            default:
            case "child2":
                return new Child2();
            break;
        }
    }
    public RunMe() {
        p = instantiateObject("child1");
    }
}

当我运行类似的代码时,Unity force关闭。我知道C#支持子类型多态性,所以我真的不确定为什么这不起作用。它没有什么特别或先进之处;所以我非常困惑。无耻地承认,我属于java阵营,我确实(不)有意识地尝试将我的java范式融入C#范式。我是没有正确使用它,还是不理解C#中的子类型是如何工作的?

强制关闭子类型多态对象实例化

您的成员名称"RunMe"与您的类"RunMe。"

public RunMe() {

就你的子类型而言,我认为你实现它的方式没有错。它应该如您所描述的那样工作。

使用

base.Value = 4

abstract类中定义为virtual的访问器上会导致问题。由于我对C#更深奥的基础感到不舒服,我真的不知道或理解为什么会出现这种情况。但是将代码修改为这样是可行的:

public abstract class Parent {
    // logic for class
    public int Value {get;set;}
    public Parent(){}
}
public class Child1 : Parent {
    // child specific logic here
    public Child1 () : base() {
        base.Value = 4;
    }
}
public class Child2 : Parent {
    // child specific logic here
    public Child2 () : base() {
        base.Value = 6;
    }
}
public class RunMe {
    Parent p;
    public Parent instantiateObject(string s) {
        switch(s) {
            case "child1":
                return new Child1();
            break;
            default:
            case "child2":
                return new Child2();
            break;
        }
    }
    public RunMe() {
        p = instantiateObject("child1");
    }
}

注意,我从抽象类Parent 的访问器中删除了virtual关键字