Да, я знаю, что об этом уже спрашивали и отвечали, но ничего полностью не решает несколько проблем.
Ссылки
По сути, я хотел бы получить из Control
, но без предоставления определенных свойств.В моем случае я проектирую Container
, который будет содержать много Element
с, организованных программным способом.Мне бы хотелось (и может потребовать ), чтобы Element
был получен из Control
, чтобы получить все рисунки и события, но также иметь возможность добавлять Element
объекты в Container
'Children
collection (по понятным причинам).
Единственная проблема в том, что если Element
наследуется от Control
, тогда его свойство Location
открыто, и пользователь может легко уничтожитьпрограммное размещение.Естественно, мой инстинкт состоит в том, чтобы сохранить все вкусности, которые идут вместе с Control
, и скрыть / отключить Location
.
. Мне известно следующее:
- Этонарушает принцип замещения SOLID Liskov (проектирование по контракту)
- Это было задано ранее
- Я мог бы инкапсулировать
Control
в моем Element
и переадресовывать все вызовы на Control
- Это было бы нелепым трудом, но без реальной выгоды.
- Инкапсулирующий
Element
все еще не совместим по типу с Control
и не может использоваться вво многих случаях, когда производная форма Control
будет.
Я чувствую, что должно быть какое-то более элегантное решение этой (казалось бы) повторяющейся проблемы.Заранее спасибо!
Редактировать
Единственный способ, которым я вижу, чтобы сделать это:
public class Element : Control
{
public new Point Location { get; private set; }
}
Но тогда у меня проблемаКак мой контейнерный класс устанавливает местоположение Element
s?В C ++ можно использовать класс друга.Я полагаю, если бы я сохранил этот элемент управления в его собственной сборке, я мог бы пометить сеттер как internal
.
Редактировать
Для тех, кто хочет что-то сделать, мойРешение было: не делать этого.Вместо этого я сделал собственный объект и сам реализовал все нажатия / перетаскивания и т. Д.Было слишком сложно попробовать использовать элемент управления, исключая такие функции, как Location.