0

我有以下设置:

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# 中的工作原理?

4

2 回答 2

0

您的成员名称“RunMe”与您的班级“RunMe”相同。您将使用“RunMe”作为您的类构造函数:

public RunMe() {

就您的子类型而言,我认为您实现它的方式没有任何问题。它应该像你描述的那样工作。

于 2015-04-07T05:00:13.273 回答
0

看来使用

base.Value = 4

virtual在类内部定义的访问器上abstract会导致问题。由于我对 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");
    }
}

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

于 2015-04-09T16:12:08.623 回答