繁体   English   中英

使用泛型方法创建接口

[英]Creating interface with generic methods

我正在尝试设计一个接口,以便它具有泛型类型的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 }
}

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

是否有任何其他解决方案可以帮助我摆脱模型类型,同时在界面中保留Get方法定义?

您可以使用this.GetType()确定继承的类类型,但这不允许您创建通用函数/参数/等。

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

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

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

选项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 { ... }

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

暂无
暂无

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

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