Переопределение метода - PullRequest
0 голосов
/ 27 мая 2010
public class Testing extends JDialog {

    public MyClass myClass;

    public Testing() {

    }
}

Учитывая приведенный выше код, возможно ли переопределить метод в myClass в классе Testing?

скажем, у myClass есть метод с именем computeCode (), могу ли я переопределить его реализации в Testing? извини, я давно не кодировал.

Ответы [ 8 ]

2 голосов
/ 27 мая 2010

если вы хотите переопределить метод из MyClass, тогда ваш класс тестирования должен его расширить.для переопределения метода необходимо выполнить отношение IS-A, тогда как ваш код находится в отношении HAS-A.

2 голосов
/ 27 мая 2010

Вы переопределяете методы классов, которые вы расширяете. Следовательно, в вашем примере ваш класс Testing может переопределить различные существующие методы JDialog. Если вы хотите переопределить computeCode() из MyClass (при условии, что это не final), вы должны сделать Testing extension MyClass.

public class Testing extends MyClass
{ 
    @Override
    public int computeCode()
    {
        return 1;
    }
} 
2 голосов
/ 27 мая 2010

Да, это, как правило, возможно (обратите внимание, что, как другие правильно отметили - вам нужно расширить его, чтобы переопределить метод). См. этот образец :

public class Animal {
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal.");
    }
}

public class Cat extends Animal {
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        myAnimal.testInstanceMethod();
    }
}

Мало того, что это возможно, но это ключевая особенность полиморфизма - возможность многократного использования кода.

Обратите внимание, что MyClass.computeCode может быть final - в этом случае его нельзя переопределить.

1 голос
/ 27 мая 2010

Формулировка вопроса запутана и утеряна.

Вот несколько ключевых моментов:

  • Вы не можете @Override то, что вы не унаследовали, чтобы начатьс
  • Вы не можете @Override что-то, что final

Вот небольшой пример:

import java.util.*;

public class OverrideExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(
            Arrays.asList("a", "b", "c")
        ) {
            @Override public String toString() {
                return "I'm a list and here are my things : " + super.toString();
            }
        };
        System.out.println(list);
        // prints "I'm a list and here are my things : [a, b, c]"
    }
}

Здесь у нас есть анонимный класс@Override метод toString(), унаследованный от java.util.ArrayList.

Обратите внимание, что здесь не class OverrideExample переопределяет ArrayList.toString();это анонимный класс (неявно) extends ArrayList, который делает.

1 голос
/ 27 мая 2010

Смотрите, если вы хотите переопределить метод с MyClass, вам нужно расширить его. В соответствии с вашим кодом, кажется, вы хотите сделать оболочку MyClass.

Wrapper означает, что вызов метода реализованного класса вызовет метод MyClass.

Я просто выясняю, как работает упаковка, как показано ниже.

public class Testing extends JDialog {

    public MyClass myClass;

    public Testing() {

    }

    public void someMethod() {
       //Add some more logic you want...
      ...
      ..
       myClass.computeCode();

    }

}

спасибо.

1 голос
/ 27 мая 2010

Вы можете переопределить метод класса только в подклассе (классе, extends классе, метод которого вы хотите переопределить). Однако, учитывая ваш скелетный код, вы можете (в пределах Testing) иметь вложенный класс, который extends MyClass и заставить экземпляр этого вложенного класса в переменную экземпляра myClass ... так что ответ должен быть "да".

Является ли это лучшим выбором (в отличие от использования интерфейсов, а не создания подклассов конкретных классов и использования Dependency Injection для получения реализаций, наиболее подходящих для вашего тестирования), это другой вопрос (и мой ответ будет, если вы вы тестируете устаревший код, который вы не можете серьезно реорганизовать, пока он не будет хорошо покрыт тестами ... тогда, вероятно, нет; -).

0 голосов
/ 27 мая 2010

Поскольку класс Testing уже унаследовал JDialog, нет способа позволить ему снова наследовать MyClass, если только не реализован интерфейс. Что вы можете сделать, это использовать какой-то шаблон дизайна. Однако это не переопределение, так как нет наследования. Адаптер - это то, что вам нужно. Опять вы теряете гибкость полиморфизма.

public class Testing extends JDialog {

 MyClass myClass = new MyClass();

 public Testing() {

 }

 public void methodA(){
     myClass.methodA();
 }

}

 class MyClass {
     public void methodA(){}
 }
0 голосов
/ 27 мая 2010

Все приведенные выше ответы действительны. Но если вы хотите расширить JDialog, но при этом переопределить метод другого класса, это возможно через интерфейсы. Интерфейсы не будут иметь определения методов, но будут иметь объявления методов. Подробнее об интерфейсах вы можете прочитать на http://java.sun.com/docs/books/tutorial/java/concepts/interface.html

В вашем случае вы можете использовать такой интерфейс

public interface MyInterface{
     public void myMethod();
}
public class Testing extends javax.swing.JDialog implements MyIterface{
     public void myMethod(){
          // code for your method
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...