C和Java中的抽象方法和重写函数
在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 D if (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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- STM32--vs1053 WAV录音实现(wav保存在flash)
- ruby – 在OSX 10.10 Yosemite上安装tiny_tds时出错
- 51调度器
- c# – WebActivatorEx在Application Start上导致ArgumentEx
- 了解一下Flex 4里的fx、mx以及s命名空间(转)
- 【cocos2d-x 】解决scrollview上的menu拖动问题以及menu it
- Evolution3D引擎技术演示
- c# – PostSharp:在目标构造函数之后初始化实例范围的方面
- ruby-on-rails – Rails 3:设计users_controller,它在哪里
- XML简介之DTD约束的相关实例