【问题标题】:Specifying a type in an interface of the type that inherits this interface在继承此接口的类型的接口中指定类型
【发布时间】:2022-01-04 17:42:47
【问题描述】:

需要这个代码的真正实现

interface IExample{
   public this ReturnMe();
}
class Example : IExample {
   public this ReturnMe(){...} //returns an instance of the Example class
} 

【问题讨论】:

标签: c# class types interface


【解决方案1】:

你可以返回接口本身:

interface IExample
{
    public IExample ReturnMe();
}
class Example : IExample
{
    public IExample ReturnMe() => new Example();
} 

或者使用curiously recurring template pattern:

interface IExample<T> where T : IExample<T>
{
    public T ReturnMe();
}

class Example : IExample<Example>
{
    public Example ReturnMe() => new Example();
} 

请注意,这不会阻止某人写class Example : IExample&lt;SomeOtherClass&gt;

自 C# 9 以来可用的另一个选项是切换到抽象基类并使用 covariant return type

abstract class ExampleBase
{
    public abstract ExampleBase ReturnMe();
}
class Example : ExampleBase
{
    public override ExampleBase ReturnMe() => new Example();
} 

【讨论】:

  • 2 号不适合我,因为没有一般继承。选项 1 适合我,但不完全适合我,我希望返回类本身(很可能在 C# 中这是不可能的)
  • Ed:您可以在选项2中指定“where T: IExample”进行继承,但选项1仍然会更好
  • @NickName73 添加了另一个选项 - 查看更新。
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多