Fortran 2008中能否用非多态过程重载延迟过程?
关于抽象类Parent与子类重载方案的可行性分析
我来结合面向对象的核心规则给你理清楚这个问题哈:
一、如果你的需求是「允许Grandchild继承Child的foo实现,不强制重写」——这个方案完全可行
按照面向对象的规则,抽象类Parent里的抽象方法foo,只要求直接的非抽象子类必须实现它。所以:
- 你定义
Child为非抽象类,它必须实现Parent的foo方法(这里你提到的foo_Child应该就是Child对foo的具体实现吧?注意方法签名必须和Parent的foo完全一致,否则不算合法重写,会编译报错) - 只要
Child的foo实现是多态的(Java中默认就是多态的,C#里需要加virtual关键字,或者因为继承自抽象方法,默认允许重写),Grandchild继承Child后,会自动继承这个foo的实现,不需要自己定义。如果后续需要扩展,Grandchild也可以选择重写foo来覆盖Child的逻辑,完全符合多态设计。
举个Java代码的例子更直观:
// 抽象父类Parent,定义抽象方法foo abstract class Parent { public abstract void foo(); } // 非抽象子类Child,实现Parent的foo class Child extends Parent { @Override public void foo() { // 这里就是你说的foo_Child逻辑 System.out.println("执行Child的foo实现"); } } // Grandchild继承Child,可选择重写foo或直接继承 class Grandchild extends Child { // 可选:重写foo // @Override // public void foo() { // System.out.println("执行Grandchild的foo实现"); // } }
测试多态的话,比如Parent p = new Grandchild(); p.foo();,如果Grandchild没重写,就会调用Child的实现;如果重写了,就调用Grandchild的,完全正常。
二、如果你的需求是「所有继承Parent的类(包括Grandchild这种间接子类)都必须重载foo」——这个方案不可行
因为如果Child是非抽象类,它必须实现Parent的抽象foo,一旦Child完成了实现,Grandchild作为子类就没有强制重写的义务了(除非Child的foo也是抽象方法,但这样Child就必须是抽象类,和你「Child是非抽象」的前提冲突)。
如果一定要让所有子类(不管直接还是间接)都自己实现foo,你需要调整设计:
- 把
Child也设为抽象类,不实现foo,让它继承Parent的抽象foo,这样所有直接继承Child的类(比如Grandchild)就必须实现foo - 或者用模板方法模式:在
Parent中把foo写成一个非抽象的模板方法,里面调用另一个抽象方法(比如doFoo),这样所有子类(包括间接)都必须实现doFoo,而foo的整体逻辑由Parent控制。
总结
回到你的问题本身:如果只是想让Grandchild可以继承Child的多态foo实现,而不用被迫自己定义,这个方案是完全可行的,符合面向对象的设计规则;但如果想强制所有继承Parent的类都必须自己实现foo,那当前的设计(Child是非抽象)就达不到,需要调整。
内容的提问来源于stack exchange,提问作者veryreverie
相关产品推荐
相关产品推荐

