强制关闭子类型多态对象实例化
Force closes on subtype polymorphic object instantiation
我有以下设置:
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 强制关闭。我知道 C# 支持子类型多态性,所以我不确定为什么这不起作用。它没有什么特别或先进的;所以我很困惑。无耻地承认,我属于 java 阵营,我确实(无意识地)尝试将我的 java 范式融入 C# 范式。我是不是没有正确使用它,还是我不了解子类型在 C# 中的工作原理?
您的成员名称 "RunMe" 与您的 class 相同 "RunMe." 您将使用 "RunMe" 作为您的 class 构造函数:
public RunMe() {
就您的子类型而言,我认为您的实现方式没有任何问题。它应该像您描述的那样工作。
似乎使用
base.Value = 4
在 abstract
class 中定义为 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");
}
}
请注意,我在摘要 class Parent
中从访问器中删除了 virtual
关键字
我有以下设置:
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 强制关闭。我知道 C# 支持子类型多态性,所以我不确定为什么这不起作用。它没有什么特别或先进的;所以我很困惑。无耻地承认,我属于 java 阵营,我确实(无意识地)尝试将我的 java 范式融入 C# 范式。我是不是没有正确使用它,还是我不了解子类型在 C# 中的工作原理?
您的成员名称 "RunMe" 与您的 class 相同 "RunMe." 您将使用 "RunMe" 作为您的 class 构造函数:
public RunMe() {
就您的子类型而言,我认为您的实现方式没有任何问题。它应该像您描述的那样工作。
似乎使用
base.Value = 4
在 abstract
class 中定义为 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");
}
}
请注意,我在摘要 class Parent
virtual
关键字