将对象转换为通用接口

时间:2016-04-11 18:22:32

标签: c# .net c#-4.0 casting

我有以下课程:

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();
    }

有没有解决方法呢?

3 个答案:

答案 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(); }

您实际上是在尝试实现抽象工厂,抽象工厂有两个用于创建对象的参数,在您的情况下,一个是泛型​​类型,另一个是工厂方法创建对象的参数。所以我建议看一下抽象的工厂设计模式。