对关联关系的双方进行子类化

时间:2016-12-29 06:52:46

标签: c# winforms inheritance

我偶尔会遇到这种类型的设计问题,但我还没有找到解决问题的一般方法。以下是详细信息:

我有一个Table类,其行标题,列标题和表本身都有Grid个实例。这两个类都是可重用的组件。

class Grid {
    public void Bar() { /* ... */}
}

class Table {
    public Grid[] Grids { get; }
    public void Foo() { /* ... */ }
}

我还有一个CustomGrid添加了一个新方法(用一些逻辑绘制花哨的颜色)。现在我想要子类Table来添加公开CustomGrid附带的新功能的方法。

class CustomGrid : Grid {
    public void Bar2() { /* ... */}
}

class CustomTable : Table {
    public void Foo2() { /* ... */ }
}
  • 但是,由于Table引用了Grid个对象,CustomTable需要向下转发CustomGrid以使用新方法,我认为这些方法并不是很漂亮。
  • 通过在Table课程中使用泛型,CustomTable可以使用CustomGrid,但我认为仍然需要进行类型检查和向下转换。
  • 我想使用组合而不是继承,但它会阻止覆盖OnPaint方法。此外,一些私有构造需要公开以用于包含类。

你会如何处理这种设计?我认为上述困难意味着其中存在问题,但请指出选项评估中的任何错误。

1 个答案:

答案 0 :(得分:1)

您可以使用new关键字:

public class CustomTable : Table
{
    new public CustomGrid[] Grids { get; }
    public void Foo2() { /* ... */ }
}

这会覆盖您的Grid[] Grids { get; }CustomGrid[] Grids { get; }