Пример:
class IGui{
protected:
virtual bool OnClicked(){return false;}
virtual bool OnHover(){return false;}
virtual bool OnScrollBarChange(){return false;}
virtual bool OnTextChange(){return false;}
...
}
class IGuiButton: public IGui{
protected:
virtual bool OnClicked() = 0;
virtual bool OnHover(){
do stuff
return true;}
...
}
Суть в том, чтобы иметь интерфейс commom для всех типов графического интерфейса, которые могут быть (где не все виртуальные объекты должны быть переопределены), а затем предоставить облегченную специализацию для кнопки, но для кнопки, они должны быть переопределены для OnClicked.
Кроме того, я думаю, что я должен сделать те кнопки, которые не должны переопределять личное (так что используйте личное наследование и используйте это причудливое «использование Base :: Method;» для того, чтобы сделать конкретные защищенными?
У этого вопроса много сторон. Первый действительно интересный вопрос:
Может ли производный класс иметь чистый виртуальный метод, который не является чистым в основе?
Ответ да, оно может. С ожидаемой (если вы ожидали, что это сработает) семантикой: тип, производный от промежуточного типа, должен реализовывать виртуальную функцию, чтобы не быть абстрактным типом. Это приводит к любопытному обстоятельству, когда основа не абстрактная, а производный тип … это будет удивительно. Только для этого я бы избежал этого в дизайне.
Если вы отметите как
private
члены, которые производные типы не должны переопределять?
Нет, для этого нет никаких причин или преимуществ. Является ли функция-член public
, protected
или же private
производные классы могут переопределить его. Любой код, который может вызывать функции через базовый тип, все равно сможет вызывать его путем приведения к базовому типу. Это приводит к другому странный вещь в твоем дизайне. Базовый класс заполнен protected
виртуальные функции, что означает, что они доступны только по производному типу. Это не определяет интерфейс и не может быть использовано как таковое. Если функция / класс берет ссылку на IGui
или IGuiButton
он не сможет многое сделать, так как нет общедоступного интерфейса. По сути, это означает, что никто не сможет вызвать ни одно из событий — если только вы не злоупотребляете дружбой, чтобы предоставить доступ к обработчику событий, но вам следует избегать этого.
Так что же такое правильный дизайн?
Есть разные альтернативы. Я бы порекомендовал это перед созданием собственного квадратное колесо Вы смотрите на те колеса, которые были изобретены в прошлом: посмотрите на различные графические структуры и библиотеки и попытайтесь понять, почему они решили создать их как таковые. Посмотрите на различия и попытайтесь определить, какие преимущества / недостатки они приносят и какой вариант соответствует вашей проблеме. Пользовательский интерфейс — это область, в которой много предшествующего уровня техники, и есть вероятность, что вы не будете разрабатывать с нуля ничего лучше, чем люди, работавшие в этой области в прошлом, — вы можете сделать это, но гораздо легче попасть в те же самые подводные камни, которые все остальные чувствовали раньше.
Я должен сказать, что думаю, что вы пытаетесь сделать плохой дизайн.
Ваш верхний уровень (IGui) «имеет все», а затем вы эффективно убираете вещи по мере продвижения по иерархии классов. На верхнем уровне обычно бывают общие вещи, и вы добавляете различия по мере движения вниз.
Вы теряете защиту, которую может дать хороший дизайн.