
Java的:
public abstract class AbstractTest { public abstract voID test() throws Exception;}public class ConcreteTest extends AbstractTest { @OverrIDe public voID test() throws Exception { }} 如您所见,ConcreteTest(扩展AbstractTest)必须覆盖test().它们具有相同的方法名称,返回类型和方法参数.子类可以省略从基类抛出的异常并抛出自己的异常.子类还可以添加其他(未)检查的异常.
正如Peter Lawrey所提到的,java接口方法是隐式抽象方法(参见我在Java Abstract Interface的SO问题).
这里至关重要的是在这种情况下方法可见性不会改变(因为它是分层可见性,即私有 – >受保护 – >公共).这是有效的:
public abstract class AbstractTest { protected abstract voID test() throws Exception;}public class ConcreteTest extends AbstractTest { @OverrIDe public voID test() throws Exception { }} (父类具有受保护的方法,子类可以覆盖相同的方法,只有2个可见性选择:protected或public).
另外,假设你有
public class B {}public class D extends B {}public abstract class Base { public abstract B foo();}public class Derived extends Base { @OverrIDe public D foo() { // Todo auto-generated method stub return new D(); }} 您将看到Derived返回D而不是B.为什么会这样?这是因为派生类遵循与父类相同的签名,派生类的返回类型是父类的返回类型的子类型.
所以,我可以这样:
Base pureBase = new Derived();B b = pureBase.foo(); //which returns class Dif (b instanceof D) { //sure,it is,do some other logic} 在C中,您可以使用Covariant Return类型获得类似的效果
C
class AbstractTest {public: virtual voID test() = 0;};class ConcreteTest : AbstractTest {public: voID test() { //Implementation here... }}; 在C中,具有纯虚函数的类(以a = 0结尾的虚函数)被称为抽象类.子类(在C中,类扩展名由:)分隔,覆盖纯虚方法(除了它不包含= 0).它具有与其父类相同的签名.
回到我们的Java示例,假设您有:
class B {};class D : B {};class Base {public: virtual B* foo() = 0;}class Derived : Base {public: D* foo() { return new D(); }} 这里完成了相同的推理(如java中所述).协变返回类型也适用于受保护和私有继承.更多关于Covariant return types.
总结以上是内存溢出为你收集整理的C和Java中的抽象方法和重写函数全部内容,希望文章能够帮你解决C和Java中的抽象方法和重写函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)