Есть ли способ иметь публичный метод, который не будет наследоваться? - PullRequest
2 голосов
/ 16 декабря 2010

У меня есть класс с открытым API.
У меня есть другие классы, которые наследуют от этого класса.
Я не использую все API, унаследованные от первого класса.

Если я изменю порядок наследования, у меня будет еще больше методов API, которые я не хочу, чтобы классы наследовали.

Языки: PHP и C #

Ответы [ 5 ]

4 голосов
/ 16 декабря 2010

Если какой-то метод не должен быть в унаследованном классе, вам, вероятно, не следует помещать его в базовый класс. Второй класс может реализовывать некоторый интерфейс, который имеет этот метод, или наследовать другим классом, который имеет этот метод и наследуется текущим базовым классом.

4 голосов
/ 16 декабря 2010

Есть ли какая-то конкретная причина, почему вы хотели бы такой метод? Я думаю, вы должны рассмотреть возможность добавления функциональности, которую ваши классы наследуют в интерфейсе. Другие функциональные возможности должны быть реализованы как частные методы.

Также рассмотрите возможность разбиения функциональности на несколько классов и затем используйте Composition вместо наследования. Если вы используете наследование для составления сложных иерархий классов, ими всегда будет трудно управлять. Вы должны отдавать предпочтение композиции, а не наследованию .

3 голосов
/ 16 декабря 2010

Я бы предложил вам использовать Шаблон декоратора .

1 голос
/ 17 декабря 2010

Я не использую все API, унаследованные от первого класса

поместите эти методы в общедоступную печать класс

У меня есть другие классы, которые наследуют от этого класса.

для этого использовать интерфейс базового класса с виртуальными методами.

1 голос
/ 17 декабря 2010

Если мы называем базовый класс B и производные классы D1, D2 ...

Два подхода:

  • Разделить B на два класса: частныйреализация (аннотация B) и открытые методы (которые вы хотите скрыть в двух других ваших классах), D3.Таким образом, чтобы «использовать» базовый класс, вы создаете экземпляр D3.Тогда D1, D2 наследуют только частную реализацию B, потому что открытый интерфейс для «B» доступен только через D3.(Если вам все еще нужны некоторые общедоступные функции в D1, D2, но вы не хотите, чтобы они были общедоступными, просто добавьте их как закрытый метод od B, а затем добавьте публичный прокси-метод в D3, который предоставляет его и просто вызываетвплоть до реализации базового класса.

  • Не наследуйте ваши классы от B. Вставьте экземпляр B в D1, D2 и просто предоставьте новый интерфейс в тех классах, которые только делаютдоступна «ограниченная функциональность».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...