c# - 声明对象类型的接口(interface)

标签 c# interface

这可能是一个关于基础设计的问题。

我想对一个神秘对象执行操作,只要它实现了我的接口(interface)IMyInterface。我希望接口(interface)定义的方法之一返回神秘对象的实例,所以...

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 的对象返回其自身类型的实例。

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

最佳答案

你可以让返回类型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. 返回接口(interface)IMyInterface:

    IMyInterface a = new MysteryObject().GetInstance(); // valid 
    MysteryObject b = new MysteryObject().GetInstance();// invalid 
    MysteryObject b = (MysteryObject)new MysteryObject().GetInstance(); // valid
    
  2. 从接口(interface)返回通用类型参数:

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

关于c# - 声明对象类型的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44577827/

相关文章:

c# - 如何使用 c# (visual studio 2008) 实现决策树 - 帮助

c# - 如何在 MVVM 项目中的用户控件之间切换

用于存储常量的 Android 嵌套接口(interface)

c++ - 从 C++ 调用 Haskell 库

c# - LargeImages 到 WPF ListView 端口

c# - 将信息记录到 azure webjobs 日志文件中?

c# - 不使用 LINQ 转换对象列表

c# - IDisposable.Dispose() 作为方法名称是什么意思?

java - CheckBox 中的 setChecked 和 setSelected 不起作用

java - 在 Java 泛型中创建类型对象