c# - 在 C# 中,有没有办法编写一个泛型,使得 Object<Child> : Object<Parent>?

标签 c# .net generics

有没有办法在 C# 中做这样的事情?考虑以下示例并假设 Child1、Child2、Child3 都是 Parent 的 child -

class Class1
{

  SomeObject< Parent > mSomeObject; 

  Class1()
  {

     if (condition1)

          mSomeObject = new SomeObject<Child1>();

     else if (condition2) 

          mSomeObject = new SomeObject<Child2>(); 

     else if (condition3) 

          mSomeObject = new SomeObject<Child3>();

  }

}

想法是 Class1 将 SomeObject 作为成员,但直到运行时才确定它应该采用 SomeObject 的什么通用形式。任何帮助,将不胜感激。谢谢!

最佳答案

你应该使用基于接口(interface)的继承。这将允许 child1、child2 和 child3 是多态的,并在不需要这种保护逻辑的情况下具有父级的特征。随着 IF 测试的消失,您的代码将更具可读性,并且以后更容易修改。

这是我刚刚用 LINQPad 编写的示例,用于展示这一点。

public interface ICar
{
    bool IsAutomatic();
}

public class Silverado : ICar
{
    public bool IsAutomatic()
    {
        return true;
    }
}

public class Semi : ICar
{
    public bool IsAutomatic()
    {
        return false;
    }
}

void Main()
{
    ICar car = new Silverado();
    bool isAuto = car.IsAutomatic();
    isAuto.Dump();

    car = new Semi();
    isAuto = car.IsAutomatic();
    isAuto.Dump();
}

输出:

True
False

我更喜欢基于接口(interface)的继承,而不是 AllenG 描述的抽象类。多重继承等原因——一个类可以实现多个接口(interface),但只能继承一个类。

希望这有助于...

关于c# - 在 C# 中,有没有办法编写一个泛型,使得 Object<Child> : Object<Parent>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292917/

相关文章:

c# - 如何使我的构造函数在 UWP MVVM 模型中异步? (MVVM Lighttoolkit)

c# - 从 T 和字符串的隐式转换

c# - 如何为位置记录定义额外的初始化逻辑?

java - 为什么不能,例如将 List<ChildClass> 传递给以 List<ParentClass> 作为参数的方法?

c# - 在线 CRM REST 服务 - 遇到问题

c# - 局部 View 不刷新

c# - 接口(interface)与抽象类(在特定情况下)

.net - Windows Server 2008 是否支持 Office 2003 互操作?

generics - 通用存储库模式的此代码中的 IEntity 是什么?

java - 如何动态地将某个泛型类型分配给List?