public class Testing extends JDialog {
public MyClass myClass;
public Testing() {
}
}
根据上面的代码,是否可以在Testing类中覆盖myClass中的方法?
说myClass有一个名为computeCode()的方法,我可以覆盖它在Testing中的实现吗?对不起,自从我编码以来已经很久了。
答案 0 :(得分:2)
是的,通常是可能的(请注意,正如其他人正确提到的那样 - 您需要扩展它以覆盖该方法)。请参阅this sample:
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 :(得分:2)
您可以覆盖扩展的类的方法。因此,在您的示例中,您的Testing
类可以覆盖JDialog
的各种现有方法。如果您想覆盖computeCode()
MyClass
(假设它不是final
),则应Testing
延长MyClass
。
public class Testing extends MyClass
{
@Override
public int computeCode()
{
return 1;
}
}
答案 2 :(得分:2)
如果要覆盖MyClass中的方法,那么测试类必须扩展它。为了覆盖方法,必须完成IS-A关系,而你的代码属于HAS-A关系。
答案 3 :(得分:1)
您只能在子类(一个类extends
您想要覆盖其方法的类的类)中覆盖类的方法。但是,根据您的骨架代码,您可以(在Testing
内)具有extends MyClass
的嵌套类,并强制将的实例嵌套类转换为myClass
实例变量......所以答案必须是“是”。
这是否是最佳选择(而不是使用接口,而不是继承具体类,并依赖依赖注入来获得最适合您测试的实现),这是一个不同的问题(我的答案是,除非你'重新测试你无法认真重构的遗留代码,直到测试覆盖良好......然后,可能不会; - )。
答案 4 :(得分:1)
请参阅,如果要覆盖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();
}
}
感谢。
答案 5 :(得分:1)
问题的措辞混淆不清。
以下是一些要点:
@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
的匿名类。
答案 6 :(得分:0)
以上所有答案均有效。但是,如果你想扩展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
}
}
答案 7 :(得分:0)
由于Testing类已经继承了JDialog,除非实现接口,否则无法再次继承MyClass。你可以做的是使用一些设计模式。然而,这不是重写,因为没有继承。 Adapter是您需要的。你再次失去了多态性的灵活性。
public class Testing extends JDialog {
MyClass myClass = new MyClass();
public Testing() {
}
public void methodA(){
myClass.methodA();
}
}
class MyClass {
public void methodA(){}
}