正在使用泛型方法创建接口
本文关键字:创建 接口 泛型方法 | 更新日期: 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类型等),否则你不能。