学习多态性
Learning about Polymorphism
为什么我无法从位于测试 class 中的主函数访问每日 class 中的方法。特别是 occursOn() 方法是我想从 main 访问的方法。如果我创建一个最初类型为 Daily 的对象,那么它允许我访问 occursOn() 方法,但如果我最初将其声明为一般约会,则它不允许。
顺便说一句,我正在自学多态。
public class Appointment{
private String description;
private String date;
public Appointment(){
this.description = "";
this.date = "";
}
public Appointment(String de, String da){
this.description = de;
this.date = da;
}
public void setDescription(String d){
this.description = d;
}
public String getDescription(){
return this.description;
}
public void setDate(String d){
this.date = d;
}
public String getDate(){
return this.date;
}
public String toString() {
return "Appointment [description=" + description + ", date=" + date + "]";
}
}
public class Daily extends Appointment{
public Daily(){
super();
}
public Daily(String de, String da){
super(de, da);
}
public boolean occursOn(int year, int month, int day){
return true;
}
public String toString(){
String str = "Daily " + super.toString();
return str;
}
}
public class Test {
public static void main(String [] args){
Appointment appt1;
appt1 = new Onetime("See doctor", "01/01/2015");
}
}
约会没有occursOn()
。
如果你有maleDuck extends duck
,你给了我一个,但只告诉我是鸭子,我可以做quack()
,但我不知道layseggs()
.
Duck ladyDuck = new FemaleDuck();
ladyDuck.layseggs(); //WRONG, not a ducks lay eggs
FemaleDuck ladyDuck = new FemaleDuck();
ladyDuck.layseggs(); //CORRECT, it's clear we're dealing with female ducks
多态性的有趣之处在于当我们 overload
quack()
(伪代码:)...
Duck[] ducks = { new MaleDuck(), new FemaleDuck() };
foreach (duck in ducks) { duck.quack() };
Assert("1 manish quack and 1 ladyish quack just happened");
...我们可以对它们一视同仁并访问它们的独特行为。但是我们不能直接调用该数组的成员 layegg()
,因为 MaleDucks
会很困难。
查看一些 tutorials 关于多态性的内容。
我不知道为什么我没有把这个放在约会方面。但我觉得所有多态性的例子都必须用汽车或动物来解释,这只是不成文的规定。 :D
你的约会class需要一个方法occursOn,它不需要被填充。
那么您可以在 classes 中覆盖它来覆盖约会。
这是因为子 classes 继承了父 classes 的属性,而不是相反。尽管您可以将 Daily 的一个实例泛化为一个约会,但是您无法在没有强制转换的情况下调用该实例上特定于 Daily 的方法。
如果你想在 Daily 和 Appointment 中都访问 occursOn(),你需要在 Appointment 中声明该方法 class 以便它的子class继承。
如果将 Daily
声明为 Appointment
,则必须将变量向下转换为正确的类型才能访问 Daily
的 occursOn
方法:
Appointment appt1;
appt1 = new Daily("See Doctor", "01/01/2015");
((Daily) appt).occursOn();
如果类型被声明为 Appointment
,那么编译器只知道 Appointment
方法,即使基础类型是 Daily
。 'Downcasting' 是将引用的类型细化为它派生的 class 类型之一的过程。请注意,当底层 class 实际上是派生类型时,您只能向下转换为派生类型,例如,如果您尝试这样做:
Appointment appt1;
appt1 = new Appointment("See Doctor");
((Daily) appt).occursOn(); //Compiler throws an error!!
你最终会陷入一个充满伤害的世界。
为什么我无法从位于测试 class 中的主函数访问每日 class 中的方法。特别是 occursOn() 方法是我想从 main 访问的方法。如果我创建一个最初类型为 Daily 的对象,那么它允许我访问 occursOn() 方法,但如果我最初将其声明为一般约会,则它不允许。
顺便说一句,我正在自学多态。
public class Appointment{
private String description;
private String date;
public Appointment(){
this.description = "";
this.date = "";
}
public Appointment(String de, String da){
this.description = de;
this.date = da;
}
public void setDescription(String d){
this.description = d;
}
public String getDescription(){
return this.description;
}
public void setDate(String d){
this.date = d;
}
public String getDate(){
return this.date;
}
public String toString() {
return "Appointment [description=" + description + ", date=" + date + "]";
}
}
public class Daily extends Appointment{
public Daily(){
super();
}
public Daily(String de, String da){
super(de, da);
}
public boolean occursOn(int year, int month, int day){
return true;
}
public String toString(){
String str = "Daily " + super.toString();
return str;
}
}
public class Test {
public static void main(String [] args){
Appointment appt1;
appt1 = new Onetime("See doctor", "01/01/2015");
}
}
约会没有occursOn()
。
如果你有maleDuck extends duck
,你给了我一个,但只告诉我是鸭子,我可以做quack()
,但我不知道layseggs()
.
Duck ladyDuck = new FemaleDuck();
ladyDuck.layseggs(); //WRONG, not a ducks lay eggs
FemaleDuck ladyDuck = new FemaleDuck();
ladyDuck.layseggs(); //CORRECT, it's clear we're dealing with female ducks
多态性的有趣之处在于当我们 overload
quack()
(伪代码:)...
Duck[] ducks = { new MaleDuck(), new FemaleDuck() };
foreach (duck in ducks) { duck.quack() };
Assert("1 manish quack and 1 ladyish quack just happened");
...我们可以对它们一视同仁并访问它们的独特行为。但是我们不能直接调用该数组的成员 layegg()
,因为 MaleDucks
会很困难。
查看一些 tutorials 关于多态性的内容。
我不知道为什么我没有把这个放在约会方面。但我觉得所有多态性的例子都必须用汽车或动物来解释,这只是不成文的规定。 :D
你的约会class需要一个方法occursOn,它不需要被填充。 那么您可以在 classes 中覆盖它来覆盖约会。
这是因为子 classes 继承了父 classes 的属性,而不是相反。尽管您可以将 Daily 的一个实例泛化为一个约会,但是您无法在没有强制转换的情况下调用该实例上特定于 Daily 的方法。
如果你想在 Daily 和 Appointment 中都访问 occursOn(),你需要在 Appointment 中声明该方法 class 以便它的子class继承。
如果将 Daily
声明为 Appointment
,则必须将变量向下转换为正确的类型才能访问 Daily
的 occursOn
方法:
Appointment appt1;
appt1 = new Daily("See Doctor", "01/01/2015");
((Daily) appt).occursOn();
如果类型被声明为 Appointment
,那么编译器只知道 Appointment
方法,即使基础类型是 Daily
。 'Downcasting' 是将引用的类型细化为它派生的 class 类型之一的过程。请注意,当底层 class 实际上是派生类型时,您只能向下转换为派生类型,例如,如果您尝试这样做:
Appointment appt1;
appt1 = new Appointment("See Doctor");
((Daily) appt).occursOn(); //Compiler throws an error!!
你最终会陷入一个充满伤害的世界。