c# - 类设计 - 具有通用后代的基类

标签 c# class-design

我有以下类(class)

  class GridBase
  {
    public object DataSource { get; set; }
  }

  class GenericGrid<T> : GridBase
  {
    public new T DataSource { get; set; }
  }

GridBase 和 Generic Grid 类都可以实例化,也可以从其中任何一个派生。

这是否被认为是实现这种层次结构的正确/可接受的方式? 或者你应该加倍努力并像下面这样实现它

  class GridBase
  {
    protected object dataSource;
    public object DataSource { get { return dataSource; } set { dataSource = value; } }
  }

  class GenericGrid<T> : GridBase
  {
    public new T DataSource { get { return (T)dataSource; } set { dataSource = value; } }
  }

当在后代中重新引入属性时,这同样适用于非泛型类,我在这里仅使用一个泛型示例。

另一个案例和问题

  abstract class SomeBase
  {
    protected abstract void DoSomething();
  }

  class Child : SomeBase
  {
    protected override void DoSomething()
    {
      /* Some implementation here */
    }
  }

这里的情况是框架“X”声明了 SomeBase 允许您定义自己的后代。他们创建的类(在运行时)然后继承自您的类(在本例中为 Child)。但是,他们不会从 DoSomething() 的实现中调用您的 DoSomething() 方法。

就他们而言,他们也不能盲目地调用 base.Dosomething(),因为典型情况是他们生成的类通常是从 SomeBase 派生的,并且由于该方法是抽象的,因此无效。 (就个人而言,我不喜欢 C# 中的这种行为)。

但无论如何,不​​调用 base.xxx() 的设计是好的还是公认的,尤其是当“意图”似乎自相矛盾时?

编辑 从框架设计的角度来看。它这样做可以/可以接受吗?如果不是,它将如何设计以防止这种情况或更好地传达他们的意图(在这两种情况下)。

最佳答案

我更喜欢这样的东西:

interface IGrid {
    object DataSource { get; }
}

interface IGrid<T> {
    T DataSource { get; }
}

public Grid : IGrid {
    public object DataSource { get; private set; }

    // details elided
}

public Grid<T> : IGrid<T> {
    public T DataSource { get; private set; }
    object IGrid.DataSource { get { return this.DataSource; } }

    // details elided
}

请注意,我不是从 Grid 继承的。

关于c# - 类设计 - 具有通用后代的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4250144/

上一篇:C# 附件执行

下一篇:C# 卸载事件

相关文章:

c# - 二进制上传 WCF 损坏的 .mov 文件

c# - 通过 ref 传入对象

c# - HttpSessionLifecycle对象序列化结构图

c# - 如何在类(class)内共享 IDisposable 资源?

c# - 快速连续的随机数

c# - 使用依赖属性绑定(bind)图像源

c# - 静态构造方法与构造函数

c# - CRUD 类库设计,返回有关业务逻辑失败的有用消息,这并不异常(exception)

c++ - 关于使用哪种设计模式的问题

c++ - 相互友情指点 : What Pattern or anti-pattern is this?