Возможно ли, что разные дочерние классы имеют различную видимость для методов родителя в Java - PullRequest
2 голосов
/ 30 декабря 2010

Возможно ли, что разные дочерние классы имеют различную видимость по сравнению с методами родителя.Предположим, существует класс A, в котором определены 10 методов.У него есть два разных дочерних ClassB и ClassC.Возможно ли, что этот ClassB и ClassC имеют доступ к различным методам ClassA.Как ClassB имеет доступ только к 6 из 10 методов, определенных в ClassA, а ClassC имеет доступ только к другим 4 методам ClassA?ClassB и ClassC находятся в одной упаковке.

Спасибо, Асит

Ответы [ 7 ]

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

Я не думаю, что это возможно с классами. Для разделения функциональности вы должны использовать interfaces вместо расширения классов.

Вполне вероятно, что ваш класс А нарушает Принцип единой ответственности , если вам нужно разделить методы таким образом.

Затем посмотрите на использование композиции вместо наследования для составления сложных классов из более простых. Также взгляните на шаблон стратегии .

Разделите вашу функциональность на интерфейсы, подобные этой -

public interface IFlyable
{
    void FlapWings();

    void Fly();
}

public interface IHuntingAnimal
{
    void Hunt();
}

Затем реализуйте свои классы следующим образом -

public class Duck : IFlyable { ...

public class Eagle : IFlyable, IHuntingAnimal { ...

public class Tiger : IHuntingAnimal { ..

Примечание: пример на C #. Вам нужно выработать Java-эквивалент.

1 голос
/ 05 января 2011

Адаптер или Декоратор шаблон поможет вам.

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

Вы можете сделать это с интерфейсами, но не с конкретными классами.

0 голосов
/ 30 декабря 2010

Я не знаю контекста вашего вопроса, поэтому я не могу прокомментировать, насколько ваш дизайн здоров и, соответственно, оправдан ли ваш мотив для этого.Поскольку другие уже заняли позицию, что ваш ClassA требует рефакторинга, я собираюсь сделать обратное и предположить, что это разумный класс с единственной четко определенной целью, и он не требует разделения.в каком случае, почему бы не использовать шаблон адаптера объекта для достижения того, что вам нужно?Вы можете предоставить необходимые методы ClassA в своих адаптерах ClassB и ClassC, реализовав методы-оболочки, которые перенаправляют вызовы вашему адаптеру ClassA.И, конечно, вы можете при желании расширить эти методы.

0 голосов
/ 30 декабря 2010

Этот ответ основан на использовании вами термина дочерний класс Краткий ответ нет Более длинный ответ В этой ситуации:Класс Base имеет следующие методы: method1, method2, method3С помощью Java невозможно настроить следующую ситуацию:класс Derived1 (этот класс расширяет класс Base) может обращаться к method1 и method2, но не может обращаться к method3.класс Derived2 (этот класс расширяет класс Base) может обращаться к method1, method2 и method3.
Оба класса находятся в одном пакете.

В Java, когда один класс расширяет другой класс, это всегда применимо:

  • Производный класс может вызывать каждый открытый метод базового класса.
  • Производный класс может вызыватькаждый защищенный метод базового класса.
  • Производный класс не может вызывать какой-либо закрытый метод базового класса.
  • Если производный класс находится в том же пакете, что и базовый класс, производный класскласс может вызывать каждый метод доступа к пакету базового класса.
0 голосов
/ 30 декабря 2010

не очень понял, что вы имеете в виду ...

Как правило, возможно, что методы родительского класса имеют разные модификаторы доступа в качестве возможных внутренних классов. но с одним условием (цитата из спецификации lang):

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

вы не можете сопоставить юзабилити класса, т. Е. Если метод из вашего класса A был "защищен", то вы можете объявить переопределяющий метод в вашем классе B как "public" но не работает наоборот

0 голосов
/ 30 декабря 2010

От вас написано, я полагаю, что у вас есть

package first;
class A {
    protected methodA() {...}
    private methodB() {...}
    public methodC() {...}
    methodD() {...}
}

package second;
class B extends A {...}
class C extends A {...}

В этом случае B и C будут видеть только методы methodA и methodC из класса A.

methodB является приватным, поэтому недоступным

methodD защищен пакетом, то есть ограничен классами в одном пакете (странный способ иметь эквивалент ключевого слова C ++ friend, теперь я понимаю) и, как следствие, не виден за пределами пакета first .

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