我是界面概念的初学者。
当我浏览“通过界面实现多重继承”的信息时,我发现了这个链接.. Multiple inheritance
我对程序员有同样的怀疑。
嗨,良好的解释非常有用在java的uml图中 动物与鸟和马没有关系为什么?是吗 必须在派生类中使用相同的方法 为什么
void birdNoise();
void horseNoise();
为什么在Peagus班上
public void horseNoise()
{
System.out.println("Horse Noise!");
}
public void birdNoise()
{
System.out.println("Bird Noise!");
}
为什么必须在那里?为什么“记住,我们必须为接口中的每个方法编写每个类自己的实现。原因?感谢这个好的解释谢谢
在该帖子中,他们在c ++中使用了多重继承,并转换为java中的接口。
1.我认为继承是在父类中有一些方法,并且每当其他类中也需要相同的方法时,那些类将继承父类并使用它。 但是在接口概念中,如果每个派生类必须定义自己的实现,那么继承它的用途是什么?
2.如果我们必须提供自己的实现,那么为什么我们不在派生类本身中定义该方法。继承它有什么用?
有人请解释。
提前致谢。
答案 0 :(得分:2)
当我从c ++切换到java时,我有同感,但现在我已经使用java了一段时间,这一切都有意义。
1.我认为继承是在父母中有一些方法 class,每当其他类需要相同的方法时 那么,那些类将继承父类并使用它。
与原作者一样,你仍然可以在java中进行多重继承,你必须使用接口。接口就像c ++中的纯虚拟类一样。
但是在界面概念中,如果每个派生类都必须定义它 自己实现那么继承它的用途是什么?
在java中实现接口的原因是为了保证该类具有这些方法。这样,您可以让特定的类实现通用接口,然后将实现该通用接口的每个特定类视为相同。
Java Design与c ++设计略有不同,但在完成几个java程序后,您将使用多个接口,就像使用多重继承一样。
答案 1 :(得分:1)
每个子类必须定义它自己的实现,因为每个子类可能稍微不同地执行操作。请考虑以下示例:
public interface animal {
//All implementers must define this method
void speak();
}
此界面指出任何动物必须有发言方式。基本上,任何类型的动物都会发出噪音。然后,我们创建了2个子类,或2种不同类型的动物。
public class Dog implements animal {
//Define how a Dog speaks
public void speak() {
System.out.println( "woof" );
}
}
然后我们定义另一只动物,猫
public class Cat implements animal {
//Define how a Cat speaks
public void speak() {
System.out.println( "meow" );
}
}
在这个例子中,猫和狗都是动物,因此必须能够说话,因为我们的界面。然而,每个人都知道猫和狗发出不同的声音。通过允许每个子类定义它的“说话方式”,我们可以在调用speak()方法时为Dog和Cat提供各自的声音,同时确保它们都是动物。
更具体地回答您的问题,继承强制它的子类具有特定方法。换句话说,接口声明“我所有的子类都将定义这些方法中的每一个”。这允许我们做的是编写处理接口中的方法的代码,而不需要知道特定的子类。我们可以安全地做到这一点,因为我们知道每个子类必须在接口类中定义方法。如果只有使用该方法的子类定义了它,那么我们就无法确定在所有子类上调用该方法是否安全。
注意:如果您不希望子类定义方法,您可以简单地定义一个这样的空方法:
public class MuteAnimal implements animal {
//A MuteAnimal can't speak!
public void speak() { }
}
答案 2 :(得分:0)
没有多态性,继承通常是无用的。用几句话来解释这一切真的不容易。我的建议是查看用于定义行为的界面(类似 can-do 关系),以及 is-a 关系的具体继承。
在所有事物的中心,您可能会学到一种称为单一责任原则的东西。这意味着一个班级有一个责任,如果你有更多的责任,你就将班级分开。
如果你举个例子,即使Pegasus同时也不是马和鸟的百分之百。它将继承马,但实现鸟类的特定特征,这些特征将在接口中定义,例如Flyable。你可以说鸟类有一种共同的飞行方式,所以从鸟类继承它们。 Pegasus略有不同,因此在使用Fly方法实现Flyable接口后,可以定义自定义逻辑。 另外,使用horseNoise和birdNoise的例子有点不切实际,你想要一个方法speak(),这将由于内部类alhorithm执行某些操作。如果那个飞马可以说话怎么办?你有每个单词的方法吗?
回到Flyable的例子,说你现在有一个视频游戏。现在你可以对此进行民族化:让我们说在游戏中发生地震。你想要每只可以飞行的动物去飞行。你现在有一系列动物游戏,所以你写这个:
foreach(Flyable flyableAnimal in animals)
flyableAnimal.Fly();
你只依靠polimorphism ......
这些只是一些随意的想法,你可以在网上找到更好的例子,希望这有帮助...
答案 3 :(得分:0)
如果A类继承自B类,那实际上意味着两件事:
继承的这两个特征在某种意义上是正交的;人们可以想象没有另一个可能有用的地方。虽然派生类只能有一个父类,从中可以获得对方法和属性的隐式访问,但它们可以定义可替换的任意数量的接口。
请注意,虽然有些人坚持认为接口形成了“has-a”而不是“is-a”关系,但我认为最好将它们视为“可__”或“是__er”,重点是界面不只是定义能力,而是根据能力定义可替代性(即“是一个”)。