【问题标题】:Force closes on subtype polymorphic object instantiation强制关闭子类型多态对象实例化
【发布时间】:2015-04-07 04:46:57
【问题描述】:

我有以下设置:

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

【问题讨论】:

    标签: c# unity3d polymorphism subtyping


    【解决方案1】:

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

    public RunMe() {
    

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

    【讨论】:

    • 当然我知道RunMe() 是该类的构造函数。但是当我尝试执行此操作时,与此力相同的实现会关闭 Unity3d 环境。
    • 您的构造函数 RunMe 的返回值为“void”。我以前没有见过这种语法,你的构造函数确实返回了一个对象引用,所以它不应该是无效的。您是否收到任何其他错误?你的程序编译了吗?
    • 哈哈,我不小心加了空格。显然我校对得不够好。它已经改变了。
    • 我编辑了我的代码,使其更能包含我想要做的事情。问题显然在于parent 类中的virtual 声明。我不完全明白为什么会这样。 MSDN 文档对我来说不是很清楚为什么会这样。
    【解决方案2】:

    看来使用

    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 关键字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      相关资源
      最近更新 更多