正在使用泛型方法创建接口

本文关键字:创建 接口 泛型方法 | 更新日期: 2023-09-27 17:59:12

我正在尝试设计一个接口,以便它具有一个泛型类型的id和一个返回实现该接口的类的类型的泛型方法。例如:

public interface IEntity <IDType, MethodReturnType>
{
     IDType ID {get; set;}
     MethodReturnType Get();
}
public class Model : IEntity<int, Model>
{
     int ID {get; set; }
     Model Get() { // do something }
}

我的问题是,把Model作为IEntity的第二个类型参数似乎很愚蠢,因为我已经在Model的类中了,这应该是一种智能的方法来确定它是什么类型(尽管使用泛型类型需要在编译时之前确定它)。

有没有其他解决方案可以帮助我去掉Model类型,同时在接口中保留get方法定义?

正在使用泛型方法创建接口

在这种情况下,有两种典型的方法来设计类和接口。我会稍微偏离你的确切例子,试图使答案更一般。

选择哪个选项实际上取决于您希望如何使用类和接口。

选项1

使接口通用,以便接口成员了解确切的类型。

public interface IEntity<TDescription>
{
    TDescription Get();
}
public class MyModel : IEntity<MyDescription>
{
     MyDescription Get() { ... }
}
public class MyDescription { ... }

这意味着当您使用接口IEntity<TDescription>时,您需要在使用时了解TDescription。这样做的好处是可以获得更多的编译时类型检查。

选项2

不要使您的接口通用,而是让您的接口成员也使用接口。

public interface IEntity
{
    IDescription Get();
}
public interface IDescription { ... }
public class MyModel : IEntity
{
    MyDescription Get() { ... }
    IDescription IEntity.Get() { return this.Get(); }
}
public class MyDescription : IDescription { ... }

这更灵活,但也意味着更少的编译时类型检查。

您可以用它来确定继承的类类型。GetType(),但这将不允许您像现在这样创建泛型函数/参数等。

因此,对于你的答案,不,除非你不会以任何方式使用该类型(你仍然可以获得类的基类型并使用它,但不能将其设置为返回类型/param类型等),否则你不能。