Защита метода суперкласса от метода подкласса - PullRequest
2 голосов
/ 05 марта 2011

Возможно ли, чтобы у класса был метод, который может быть вызван только его объектами и скрыт для объекта подкласса?Например:

class ClassOne {
    ... // attributes

    public void doSomething() { ... }
}

class ClassTwo extends ClassOne {
    ... // attributes and methods
}

ClassOne c1 = new ClassOne();
c1.doSomething(); // ok to call

ClassTwo c2 = new ClassTwo();
c2.doSomething(); // forbidden

Я знаю, что это кажется странным мышлением в терминах наследования, но возможно ли это?

PS: цель этого вопроса просто узнать больше онаследование ОО программирования.

Ответы [ 3 ]

5 голосов
/ 05 марта 2011

Это невозможно и ваше право, что это нарушит наследство. Подумайте о

ClassOne c2 = new ClassTwo();
c2.doSomething(); // what to do?

Это должно работать, потому что ClassTwo является ClassOne. Редактировать: по крайней мере, он должен компилироваться, если метод переопределен и делает что-то еще, зависит от вашего дизайна. Но вы не можете заставить компилятор выдавать ошибку об этом.

3 голосов
/ 05 марта 2011

Поскольку doSomething объявлен в classOne, он будет доступен в любых подклассах. Вы не можете скрыть это или уменьшить его видимость (сделать его частным или защищенным). Поскольку ClassTwo является ClassOne, он может делать все, что может делать ClassOne.

Самое близкое, что вы можете прийти - что-то вроде:

class ClassTwo extends ClassOne {
   public void doSomething() { throw new UnsupportedOperationException(); }
}

, который не совсем делает то, что вы хотите.

Если вы находитесь в ситуации, когда вам нужно сделать это лучше, вероятно, следует переосмыслить иерархию классов на типы вашего класса, которые имеют метод doSomething, и типы, которые не

public class Parent { ... }
public class ClassOne extends Parent {
   public void doSomething(){ ... }
}
public class ClassTwo extends Parent { 
}

или поместите doSomething в интерфейс.

0 голосов
/ 05 марта 2011

Может быть, я вас неправильно понял, но почему бы вам просто не сделать свой метод закрытым или пакет видимым?

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