7

我正在试验通用约束。当这样声明一个类的约束时:

    public class DocumentPrinter<T> where T : IFooDoc

我可以在 DocumentPrinter 类的方法中访问由 IFooDoc 声明的方法。但是,如果我让 DocumentPrinter 实现一个声明约束的接口,例如:

public interface IDocumentPrinter<T> where T : IFooDoc
{
    void Add(T fooDoc);
    void PrintFoos();
}

然后像这样声明 DocumentPrinter:

   public class DocumentPrinter<T>: IDocumentPrinter<T>

IFooDoc 实例的属性/方法在 Document 打印机的方法中不再可用。如果我要访问由该类型声明的成员,我似乎必须在类本身上显式声明一个接口约束。

我是否正确理解这一点,或者是否可以在接口上声明约束并让类实现该约束?

4

2 回答 2

8

我是否正确理解这一点,或者是否可以在接口上声明约束并让类实现该约束?

正确的。您也有1来声明泛型类的类型参数的约束。仅仅因为您将类型参数命名为与类型参数DocumentPrinter<T>同名IDocumentPrinter<T>并不意味着它们是相同的类型。当你声明

public class DocumentPrinter<T> : IDocumentPrinter<T>

您实际上是在说使用T参数化DocumentPrinter<T>来参数化IDocumentPrinter<T>现在它们是相同的类型。但要使其合法,TfromDocumentPrinter<T>必须满足对类型参数 for 的所有约束IDocumentPrinter<T>。因此,您必须明确表示T满足T : IFooDoc.

1:显然我需要明确说明这一点。如果您不执行语言规范要求您执行的操作,您的代码将无法编译。语言规范要求在参数化泛型类型时,参数化它的类型必须满足对该泛型类型的类型参数的所有约束。如果不这样做,您的代码将无法编译。

于 2013-06-30T14:45:19.777 回答
3

IFooDoc 实例的属性/方法在文档打印机的方法中不再可用

好吧,当您的代码无法编译时,IntelliSense 告诉您的内容有点无关紧要。

如果你想实现IDocumentPrinter<T>,你必须满足它的约束。如果不这样做,您的代码将无法编译。

于 2013-06-30T15:07:39.650 回答