Я сталкиваюсь с этим вопросом дизайна сейчас и потом, но я не нашел общий способ его решения. Вот подробности:Подклассификация отношений обеих сторон
У меня есть класс 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
. Кроме того, некоторые частные конструкции должны быть преданы гласности для использования в содержащем классе.
Как вы подходите к этому дизайну? Я полагаю, что вышеперечисленные трудности подразумевают проблему, но, пожалуйста, указывайте на любые ошибки в оценке вариантов.
Спасибо. Однако это приведет к распределению двух отдельных массивов в классе Table и CustomTable. – henginy