super.super.func ()?- Java полиморфизм - PullRequest
2 голосов
/ 18 января 2011

Скажем, у меня в Java есть 3 класса, тогда как в супер-классе есть функция с именем func (), теперь я создаю подкласс, который переопределяет это, и подкласс для моего подкласса, теперь работая над моим подклассом я назову 'func ()' подкласса, а суперкласс?

Я попытался привести «this» «указатель», но Java «исправляет» его во время выполнения и вызывает функцию subub func ().

Edit: Спасибо всем; «Скин вернулся за чертежную доску».

Ответы [ 7 ]

5 голосов
/ 18 января 2011

Лучшее, что вы можете сделать, это вызвать super.func () в вашем классе subub, а реализация func () в вашем подклассе также вызвать super.func ().

Однако спросите себя, еслиМне нужны знания не только о реализации моих родителей, но и о реализации моих бабушек и дедушек. У меня есть проблемы с дизайном?Откровенно говоря, это срабатывает мой инстинкт "Что-то воняет в холодильнике".Вам нужно переоценить, почему вы хотите это сделать.

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

Я бы запрыгнул на поезд "что-то в этом дизайне пахнет смешно".Обычно вы переопределяете метод, чтобы он работал правильно для этого конкретного подкласса.Если у вас есть код в родительском классе, который совместно используется несколькими подклассами, возможно, этот код можно было бы переместить в не переопределенный метод, чтобы он был легко доступен для всех детей / внуков / и т.д.перевернуть свой дизайн и использовать больше шаблонного подхода?(http://en.wikipedia.org/wiki/Template_method_pattern)

Идея Template Method заключается в том, что у вас есть некоторый алгоритм в родительском классе, и вы можете заполнить части, которые должны быть специфичными для класса, путем полиморфных вызовов в ваши подклассы.подробно в вашем вопросе, но, судя по звукам вещей, я бы действительно внимательно посмотрел на ваш дизайн и посмотрел, имеет ли он смысл.

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

Это невозможно в Java. И кстати. в Java нет указателей.

0 голосов
/ 18 января 2011

Почему бы вам не иметь func() не быть унаследованным (назовите его funcBase() или что-то еще), а затем добавить функцию-оболочку func(), которая ее вызывает?то, что вы пытаетесь сделать, но звучит так, как будто ваш класс не подходит для того, что вы хотите, поэтому вы можете захотеть использовать отдельные функции в A, вместо того, чтобы пытаться пробраться вверх по лестнице.

0 голосов
/ 18 января 2011

Вы можете получить доступ к методам суперкласса из самого подкласса, например,

class A {
   void foo() {...}
}

class B extends A {
   void foo() {...}
   void defaultFoo() { super.foo(); }
}

Тем не менее, вы действительно не должны раскрывать переопределенные методы таким образом, вы должны написать B.foo() таким образом, чтобы он хорошо работал для A и B. Вот где - это хорошая идея используйте super.foo(); вот так:

 class B extends A {
    void foo() { 
      super.foo(); //call superclass implementation first
      ... //do stuff specific to B
    }
 }

Обновление: В ответ на ваш комментарий о попытке доступа к реализации на 2 уровня выше, вот способ сделать это.

class A {
   void foo() { 
     defaultFoo(); 
   }
   protected void defaultFoo() { ... }

}

class B extends A {
   void foo() {...}
}

class C extends B {
   void foo() {
     defaultFoo(); 
     ... //do other stuff
   }
}

Это более здоровая схема кодирования того, что вы хотите сделать.

0 голосов
/ 18 января 2011

Этот пример - единственный способ вызвать "дедушкин" супер метод.

class A{
    public void foo(){ System.out.println("Hi"); }
}

class B extends A{
    public void foo(){ super(); }
}

class C extends B{
    public void foo(){ super(); }
}

Это была бы другая история, если B не отменяет foo().

Другим вариантом было бы использование метода «защищенного помощника» в среднем классе.

class D{
    public void foo(){ System.out.println("Hi"); }
}

class E extends D{
    public void foo(){ System.out.println("Hello"); }
    protected void bar(){ super.foo(); }
}

class F extends E{
    public void foo(){ super.bar(); }
}
0 голосов
/ 18 января 2011

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

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