【发布时间】:2017-05-14 07:18:13
【问题描述】:
我有一个通用基类和两个从基类派生的类。我想用对象工厂创建这种派生类。但我不能用通用基类做到这一点。我可以用这种方式在 Java 中毫无问题地做到这一点。我还在 c# 中通过装箱和拆箱解决了这个问题。这样做的正确方法是什么?
public abstract class Base<T> {
public abstract T Value {
get;
set;
}
}
public class Derived1 : Base<int> {
int value;
public override int Value {
get {
return value;
}
set {
this.value = value;
}
}
}
public class Derived2 : Base<float> {
float value;
public override float Value {
get {
return value;
}
set {
this.value = value;
}
}
}
public class Factory {
public Base create(int type) {
switch(type) {
case 1:
return new Derived1();
case 2:
return new Derived2();
}
}
}
谢谢!
已解决:我知道,由于任何接口都没有通用方法,因此它们也无济于事。唯一的解决方案是将值装箱到对象中。这是我的解决方案。
public abstract class Base {
public abstract object Value {
get;
set;
}
}
public class Derived1 : Base {
int value;
public override object Value {
get {
return value;
}
set {
this.value = (int) value;
}
}
}
public class Derived2 : Base {
float value;
public override object Value {
get {
return value;
}
set {
this.value = (float) value;
}
}
}
public class Factory {
public Base create(int type) {
switch(type) {
case 1:
return new Derived1();
case 2:
return new Derived2();
default:
return null;
}
}
}
现在我可以将所有派生对象视为基础对象。
【问题讨论】:
-
我有点迷路了。你那里有什么问题?
-
只要您不介意在为
Factory添加支持的类型时继续添加int值分配,这就足够了。 ...除了 @PeterA.Schneider 指出的那样,您必须返回非通用Base<T>。 -
@TyCobb 我猜你不能这样使用
Base;您必须在Base<int>或Base<float>之间做出选择,哪种方式会破坏目的。 -
解决方案当然是使
Factory.create()通用。 (是的,你现在说的,@TyCobb。) -
@PeterA.Schneider Awww 我错过了工厂中的
Base签名。泛型必须传播到create调用
标签: c# generics inheritance polymorphism