我有一个超级类,动物,有两个子类,猫和狗。狗和猫都需要有特定的说话和移动方法。以下是实现这一目标的两种选择:
这些方法中的一种比其他方法更合适吗?我意识到如果我有一个动物的数组列表,我会这样写:
ArrayList Animal<allAnimals> = new ArrayList <Animal>():
allAnimals.add(new Dog());
allAnimals.add(new Cat());
//If I override the methods, I can simply go:
for (Animal a: allAnimals) a.move();
//Where as if I implemented the methods, I would not need be able to do this. I would need to cast the animal as its specific animal. e.g. If I knew the animal was a dog.
Dog aDog= (Dog) a;
a.move();
因此,重写和实现可能有一定的优点和缺点,这取决于它们所使用的情况。还有谁能详细说明这一点吗?
首先,从子类的角度来看,重写或实现一个方法没有区别。因此,您编写的代码在所有情况下都完全相同(在Java中,所有方法都像C++virtual
函数一样;调用的方法是被引用的实际类的方法)。
因此,决定是定义一个超类,它是一个接口,一个抽象类,或者一个可实例化的类。
如果有必要创建超类的对象(new Animal()
),则应使用可实例化类。
接口,当您只定义契约,实现留给每个子类。
这取决于问题的范围来决定哪种用途。例如,如果move()
只是表示“更改动物的x,y坐标”,那么很可能它应该是抽象类中实现的方法。但是如果您必须定义动物如何移动,那么animal
将是一个更好的接口,因此每个子类都定义它。
问题内容: 如何在C ++中创建一个抽象类,该抽象类具有一些我想在子类中重写的抽象方法?该文件应如何显示?是否有一个,如果是的话,应该看起来如何? 在Java中,它看起来像这样: 对于我来说,将此代码转换为C ++就足够了。 编辑: 我创建了代码,但是当我尝试遍历对象时,出现以下错误: 使用此代码: 问题答案: 在Java中,除非您声明了所有方法,否则默认情况下所有方法都是默认方法。在C ++中,
所以我有两个类。一个只有纯粹的虚拟函数。另一个实现了这些函数,并从第一个类派生出来。我知道我不能实例化第一个类。但是当我试图创建第二个类的对象时,它也失败了。 我的第二节课大体上是这样的: 执行: 下面是我如何实例化它并得到错误: 我哪里做错了? 第一课
我正在开发一个旧的Struts应用程序,它有一个抽象操作,通过填充Excel模板文件来创建Excel导出。 每个Excel导出操作都扩展此父类,并添加自己的实现来填充Excel模板,并定义自己的模板和输出文件名。 实现是这样的,这就是SonarQube“警告”代码重复的地方: 有没有办法避免重复?
问题内容: 我得到了几种解释,但是到目前为止,我还无法理解Java中的抽象类和方法是什么。 有人说它必须与程序的安全性做些关系,另一些人说不是那样。 即使从Dietel&Dietel的书中,我也不明白它的目的。我们何时,何地,为什么使用它? 请像您正在教初学者一样进行解释,非常感谢您的帮助。 问题答案: 抽象类是无法实例化的类。唯一的目的是扩展其他类。 抽象方法是抽象类中的方法(必须声明为抽象),
下面是解释我的情况的基本框架代码。 这是超级抽象类: 这是超级抽象类的一个子类:(注意,我删除了其他函数,比如构造函数和方法,以缩短文章的篇幅 我想在抽象类中使用这种公共无效支付(int金额)方法;然而,超级抽象类Person不会接受支付(付款),因为该方法不在范围内。如何使这个工作? 谢谢~
问题内容: 抽象类是否必须至少具有一个抽象方法? 问题答案: 这篇文章的主题和正文提出了两个不同的问题: 它应该至少有一个抽象成员吗? 是否需要至少一个抽象成员? #2的答案肯定是“否”。 #1的答案是主观的,是风格的问题。我个人会说是的。如果您的目的是防止实例化一个类(没有抽象方法),那么最好的方法是使用构造函数,而不是对其进行标记。