声明对象类型的接口

时间:2017-06-15 22:13:10

标签: c# interface

这可能是关于基本设计的问题。

我想对mystery对象执行操作,只要它实现我的接口IMyInterface。我希望interace定义的方法之一能够返回一个神秘对象的实例......

IMyInterface
  {
    object GetInstance();
  }

public class MysteryObject : IMYInterface
}
  public object GetInstance()
    {
      MysteryObject instance = new MysteryObject();
      return instance;
    }
}

但这会导致不必要的“对象”类型以及与之相关的开销。 C#特别使用泛型类型来消除这种开销。做这样的事情是理想的:

IMyInterface
  {
    T GetInstance<T>();
  }

public class MysteryObject : IMYInterface
}
  public MysteryObject GetInstance<MysteryObject>()
    {
      MysteryObject instance = new MysteryObject();
      return instance;
    }
}

我知道第二个例子不起作用。我知道语法错了。 ..但我想知道是否有更好的方法来要求实现IMyInterface的对象返回它自己类型的实例。

我的例子有点奇怪,但我认为大多数人会理解这种情绪。奇怪的是,我发现很少有这方面的例子或问题。

2 个答案:

答案 0 :(得分:4)

您只需输入返回类型IMyInterface

public interface IMyInterface
{
    IMyInterface GetInstance();
}

public class MysteryObject : IMyInterface
{
    public IMyInterface GetInstance()
    {
        MysteryObject instance = new MysteryObject();
        return instance;
    }
}

或者使用泛型:

public interface IMyInterface<T>
{
    T GetInstance();
}

public class MysteryObject : IMyInterface<MysteryObject>
{
    public MysteryObject GetInstance()
    {
        MysteryObject instance = new MysteryObject();
        return instance;
    }
}

如果您希望泛型参数的类型为IMyInterface,则可以添加如下约束:

public interface IMyInterface<T>
    where T : IMyInterface<T>
{
    T GetInstance();
}

<强>更新

以下是一些示例用法,以了解这两个版本之间的区别:

  1. 返回界面IMyInterface

    IMyInterface a = new MysteryObject().GetInstance(); // valid 
    MysteryObject b = new MysteryObject().GetInstance();// invalid 
    MysteryObject b = (MysteryObject)new MysteryObject().GetInstance(); // valid
    
  2. 从界面返回泛型类型参数:

    IMyInterface<MysteryObject> a = new MysteryObject().GetInstance(); //valid
    MysteryObject b = new MysteryObject().GetInstance(); //valid
    

答案 1 :(得分:2)

几乎拥有它。您需要使整个界面通用:

IMyInterface<T>
  {
    T GetInstance();
  }

public class MysteryObject : IMYInterface<MysteryObject>
}
  public MysteryObject GetInstance()
    {
      MysteryObject instance = new MysteryObject();
      return instance;
    }
}