繁体   English   中英

C#:使用泛型类的非泛型类未定义

[英]C#: Non-Generic classes using generic classes undefined

我有一个通用接口

public interface TheInterface<T> where T : IObject

我也有一个与此接口一起工作的对象类

public class SomeObject : IObject

然后,我有一个实现接口的类

public class ClassThatWorksWithSomeObject : TheInterface<SomeObject>

这一切都足够好。 稍后,我添加一个与TheInterface类一起使用的类,而与他使用的IObject版本无关。

public class IDoStuffToInterface
{
    public IDoStuffToInterface(TheInterface<IObject> interface)
    {
         //bla bla
    }
}

问题是我无法在其中传递ClassThatWorksWithSomeObject ,即使它是从接口继承而来的,而通用对象是从IObject继承来的。

我想在某些情况下,如果这样做可能会造成伤害,但我想不到。

有办法更好地做到这一点吗?

tvanfosson提到的另一种方法是使您的IDoStuffToInterface类通用。 如果(如示例中所示)将TheInterface传递给构造函数并(大概)存储在类中,则这也将很好地工作。

但是,如果它只是使用TheInterface的函数(甚至是构造函数),并且没有存储在类中 ,则使该函数本身具有通用性并让类保持独立可能会更好。 例如:

public class IDoStuffToInterface
{
    public void DoSomething<T>(TheInterface<T> theInterface) where T : IObject
    {
        //bla bla
    }
}

这将允许您执行以下操作:

ClassThatWorksWithSomeObject myObject = new ClassThatWorksWithSomeObject();
IDoStuffToInterface actor = new IDoStuffToInterface();
actor.DoSomething(myObject);

可以毫无问题地进行编译,因为编译器可以推断出您实际上正在调用

actor.DoSomething<SomeObject>(myObject);

现在,我认为如果可以控制接口定义,那么使用协方差可能仍然是最佳选择。 但是我想将此添加为当您在界面中没有这种程度的控制时的另一种选择。

我不知道具体的细节,您可以尝试:

public interface TheInterface<out T> where T : IObject 

如果您使用的是C#4.0

我认为您正在执行的操作应该可以,但是您可能需要使用协方差和逆差关键字

您需要对TheInterface协变量进行定义,以便它接受更广泛的IObject类型:

public interface TheInterface<out T> where T : IObject

您应该可以在C#4.0中通过将接口类型标记为逆变来做到这一点,但是我认为您也可以通过使IDoStuffInterface泛型来解决此问题。

public class IDoStuffToInterface<T> where T : IObject
{
    public IDoStuffToInterface(TheInterface<T> interface)
    {
         //bla bla
    }
}

由于SomeObject符合T资格,并且ClassThatWorksWithSomeObject实现TheInterface<SomeObject> ,因此它应该可以作为参数接受。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM