我有以下课程:
class MyObject { }
class MyObject2 { }
interface Parent<T>
{
void DoSomething(T myObj);
}
class Child1 : Parent<MyObject1>
{
public void DoSomething(MyObject1 myObj) { }
}
class Child2 : Parent<MyObject2>
{
public void DoSomething(MyObject2 myObj) { }
}
我想创建一个返回父级的工厂方法,但是我得到以下转换错误
无法隐式转换类型&#39; Child1&#39;到了父母的#39;存在显式转换(您是否错过了演员?)
static Parent<object> Factory()
{
return new Child1();
}
有没有解决方法呢?
答案 0 :(得分:5)
你要求的是不可能的。将Parent<MyObject1>
称为Parent<object>
是没有意义的。如果您有string
,则无法将其传递给签名为DoSomething(MyObject1)
的方法。你需要找到另一种方法来做你想做的事。
答案 1 :(得分:0)
我没有完全测试这个,所以可能会有一些错误,但据我所知你可以实现这一点,虽然有点草率,但创建一个界面,如:
public interface Parent
{
void DoSomething(object myObj);
}
像
这样的抽象类public abstract class BaseParent<T> : Parent<T>, Parent
{
public abstract void DoSomething(T myObj);
public void DoSomething(object myObj)
{
T obj = myObj as T;
if (obj != null)
{
DoSomething(obj);
return;
}
// Do something to handle null values, unexpected values
}
}
修改Child1和Child2以实现抽象类。即:
class Child1 : BaseParent<MyObject1>
您应该能够将Child1或Child2强制转换为&#34; Parent&#34;。
注意,当myObj是类型为T的值为null时,这不会处理这种情况,所以如果你需要接受空值,你需要做更多的事情。
(如果你真的应该首先这样做,如果你传递的是一个不正确类型的对象......本来应该发生什么,那么这是值得怀疑的。)
答案 2 :(得分:0)
这非常有趣,混合了泛型和子类。但在我看来,你不需要两个子类,因为它们实际上是同一个类,只是因为泛型参数不同。
如果你写
Public static Parent<MyObject1> Factory()
{
Return new Child1();
}
然后错误就消失了。本质上意味着返回类型应该是具体类型,因为工厂方法本身是非通用的。
所以你需要将工厂方法设为通用方法,如下所示:
Public static Parent<T> Factory<T>() { return (Parent<T>)new Child1(); }
您实际上是在尝试实现抽象工厂,抽象工厂有两个用于创建对象的参数,在您的情况下,一个是泛型类型,另一个是工厂方法创建对象的参数。所以我建议看一下抽象的工厂设计模式。