C和Java中的抽象方法和重写函数

C和Java中的抽象方法和重写函数,第1张

概述在C和 Java或他们尊重的规则中,对覆盖抽象方法有什么限制.必须匹配参数或返回类型.我通常看到只使用返回类型而没有参数实现的抽象函数,是由派生类来指定其余的.它是如何工作的? 方法重写必须与它覆盖的父方法具有相同的方法签名,否则不会调用覆盖. Java的: public abstract class AbstractTest { public abstract void test() 在C和 Java或他们尊重的规则中,对覆盖抽象方法有什么限制.必须匹配参数或返回类型.我通常看到只使用返回类型而没有参数实现的抽象函数,是由派生类来指定其余的.它是如何工作的?解决方法 方法重写必须与它覆盖的父方法具有相同的方法签名,否则不会调用覆盖.

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中的抽象方法和重写函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1214151.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存