通过接口实现多重继承

时间:2011-07-18 19:13:17

标签: java interface multiple-inheritance

我是界面概念的初学者。

当我浏览“通过界面实现多重继承”的信息时,我发现了这个链接.. 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.如果我们必须提供自己的实现,那么为什么我们不在派生类本身中定义该方法。继承它有什么用?

有人请解释。

提前致谢。

4 个答案:

答案 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类,那实际上意味着两件事:

  1. A类可以隐式使用B类的所有方法和属性,只需定义实际上对A类唯一的功能。
  2. 期望B类对象的代码将接受A类型的对象。

继承的这两个特征在某种意义上是正交的;人们可以想象没有另一个可能有用的地方。虽然派生类只能有一个父类,从中可以获得对方法和属性的隐式访问,但它们可以定义可替换的任意数量的接口。

请注意,虽然有些人坚持认为接口形成了“has-a”而不是“is-a”关系,但我认为最好将它们视为“可__”或“是__er”,重点是界面不只是定义能力,而是根据能力定义可替代性(即“是一个”)。