Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制关闭子类型多态对象实例化_C#_Unity3d_Polymorphism_Subtyping - Fatal编程技术网

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

C# 强制关闭子类型多态对象实例化,c#,unity3d,polymorphism,subtyping,C#,Unity3d,Polymorphism,Subtyping,我有以下设置: 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 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相同。您将使用RunMe作为类构造函数:

public RunMe() {
至于您的子类型,我认为您实现它的方式没有任何问题。它应该按照您所描述的那样工作。

使用

base.Value = 4
在抽象类中定义为虚拟的访问器上,会导致问题。由于我对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关键字

请确保我理解RunMe是类的构造函数。但是当我尝试这样做时,我的实现与这个force相同,它会关闭Unity3d环境。您的构造函数RunMe的返回值为void。我以前没有见过这种语法,而且您的构造函数实际上返回了一个对象引用,所以它不应该是空的。您是否收到任何其他错误?你的程序正在编译吗?哈哈,我不小心添加了空。显然我校对得不够好。它已被更改。我编辑了代码,以便更全面地包含我要做的事情。问题显然在于父类中的虚拟声明。我不完全明白为什么会这样。MSDN文档对我来说不是很清楚为什么会出现这种情况。