2016-12-29 3 views
1

Я сталкиваюсь с этим вопросом дизайна сейчас и потом, но я не нашел общий способ его решения. Вот подробности:Подклассификация отношений обеих сторон

У меня есть класс 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

Вы можете использовать ключевое слово new:

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

Это перекроет ваш Grid[] Grids { get; } к CustomGrid[] Grids { get; }

+0

Спасибо. Однако это приведет к распределению двух отдельных массивов в классе Table и CustomTable. – henginy

Смежные вопросы