在我大学的Java课程中,我们教这个例子。虽然我当然理解这是如何工作的,但我无法想象现实生活中的一个例子,在这个例子中,这种实践可能是有用的。在我看来,这会使代码更难理解。更具体地说,使用类声明对象并将其分配给另一个类(Small smallBig = new Big();
)是否有一定的好处,您能给出一个简单的场景,在这个场景中,这个实践可能很有用吗?
守则:
public class Small {
public int value;
public Small() {value = 10;}
public int getValue() {return value;}
}
public class Big extends Small {
public int value;
public Big() {value = 40;}
public int getValue() {return value-10;}
}
public class Main {
public static void main (String args[]) {
Small small = new Small();
Small smallBig = new Big();
Big big = new Big();
System.out.println(small.getValue());
System.out.println(smallBig.getValue());
System.out.println(big.getValue());
System.out.println(small.value);
System.out.println(smallBig.value);
System.out.println(big.value);
small = (Small) big;
System.out.println(small.getValue());
System.out.println(small.value);
big = (Big) small;
System.out.println(big.getValue());
System.out.println(big.value);
}
}
产出:
10
30
30
10
10
40
30
10
30
40
发布于 2014-12-01 13:48:13
创建一个同时在Big
和Small
上操作的方法将有助于更好地说明这一点。
假设问题中已经使用了相同的类定义,则可以创建一个同时打印getValue()
和value
的方法。因为Big extends Small
,您只需要一种方法。
public void printValues(Small val) {
System.out.println("getValue() == " + val.getValue());
System.out.println("value == " + val.value);
}
如果您没有这种关系,并且能够将Big
对象分配给Small
变量(请记住:将值传递给方法与分配变量相同),则需要有两个不同的方法来处理这种情况。
将extends
关键字视为A Big is a more specific type of Small
的意思是很有帮助的。一般来说,最好是编写使用最小特定类型来处理事情的方法,因为它将允许该方法处理您还没有想象过的情况。
例如,假设某一行的某个地方,有人决定写
class Medium extends Small {
public Medium() {value = 20;}
public int getValue() {return value-5;}
}
printValues()
方法已经可以处理这个类了,尽管我们编写它时并不知道Medium
。
发布于 2014-12-01 13:33:01
我觉得在这份文件里会很有用的:
public class Person{
Mobility mobility;
Person(Mobility mobility){this.mobility = mobility;}
}
public class Mobility{
int speed;
public Mobility(int speed){this.speed = speed;}
}
public class Car extends Mobility{
public Car(int speed){super(speed);}
}
public class Main {
public static void main (String args[]) {
Car ferrari = new Car(1000);
Person john = new Person(ferrari);
}
}
希望我能帮你。
发布于 2014-12-01 13:44:26
在本例中,您使用getValue作为模板方法"pattern“。
让我们以你为例
public class Small {
public int value;
public Small() {value = 10;}
public int getValue() {// this method fetches data from database}
}
public class Big extends Small {
public int value;
public Big() {value = 40;}
public int getValue() {//this method fetches data from xml}
public class Big2 extends Small {
public int value;
public Big() {value = 40;}
public int getValue() {//this method fetched data from some server}
}
正如您所看到的,getValue的实现正在发生变化。每个子类都提供自己的getValue实现。因此,它使我的超类有机会在运行时使用此方法的不同实现(在您的情况下)。我希望这能说明清楚。看看模板方法模式,你会得到一个更好的想法。
https://stackoverflow.com/questions/27229410
复制相似问题