@bigburn
Делаю неживое живым

В каких языках есть встроенная возможность и синтаксис для удаления определенных методов и/или свойств наследуемых классов при создании класса?

в каких языках есть подобный функционал?
class A:
    var a1
    var a2

class B extends A:
    remove a1


remove удаляет свойство a2 из класса B, экземпляры класса B создаются уже без a2

То есть при создании нового класса, в нём можно указывать, какие свойства/методы наследуемых классов удалить.
В других местах кода remove работать не должен

Насколько знаю, такое можно реализовать например в Python с помощью type(), но интересует именно примеры языков со встроенной синтаксической поддержкой такой фичи (то есть где при создании класса можно указывать например с помощью keyword: "вот эти элементы давайте удалим из данного класса").
  • Вопрос задан
  • 208 просмотров
Пригласить эксперта
Ответы на вопрос 4
Adamos
@Adamos
Если сегодня ночью к вам в окно постучит мрачная старуха - это у Барбары Лисков есть к вам разговор.
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
Весь смысл наследования в том, что экземпляр класса B можно использовать и как экземпляр класса A (но не наоборот). Если из B удалить какой-то атрибут, то что будет с наследованием? Если просто пытаться его как-то скрыть, то это не поможет - ведь можно приведением типов экземпляр класса B превратить в экземпляр класса A и получить обратно свой доступ к нужному полю.

И вообще, вот, например, есть библиотека, которая умеет работать с объектами класса A. Библиотека скомпилирована кем-то, её исходный код недоступен. Мы определяем класс-потомок B и далее используем функции библиотеки на объектах этого класса. Всё хорошо, но мы уже не можем запретить библиотеке работать с этим полем.

PS: В своё время намного лучше понять ООП мне помогло чтение описания внутреннего устройства классов в Turborland Pascal. Устроены классы (в Pascal они называются объектами, но это не столь важно) примерно так:

1. Ссылка на таблицу виртуальных методов (VMT)
2. Поле 1.
3. Поле 2.
...

VMT устроена так:

1. Ссылка на метод 1
2. Ссылка на метод 2
...

Наследуемый класс отличается от исходного тем, что у него более длинный список полей (но все поля исходного имеются в наличии и находятся по тем же самым смещениям), а также отличаются адреса переопределённых методов, плюс сама таблица VMT может быть длинее за счёт добавленных новых методов (но те же самые старые методы находятся по тем же смещениям).

За счёт этого даже уже ранее скомпилированный код, ничего не знающий о наследуемых классах, работает с ними как со своими родными.
Ответ написан
Такого нет и быть не может, тк это ломает всю концепцию наследования.
Скорее всего, вы хотите сделать что-то неправильное, раз у вас возникло такое желание.

UPD: Посмотрел комменты. Если уж хотите взять чужой модуль и скрыть что-то из него, то тут не нужно использовать наследование.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Смотрите использование интерфейсов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы