Java 通过接口实现多重继承

Java 通过接口实现多重继承,java,interface,multiple-inheritance,Java,Interface,Multiple Inheritance,我是界面概念的初学者 当我浏览有关“通过接口实现多重继承”的信息时,我遇到了以下链接 我和那个学生有同样的疑问 您好,很好的解释在java的uml图中非常有用 鸟和马和动物之间没有联系,为什么?它是 在派生类中使用相同方法所必需的 为什么 void birdNoise(); void horseNoise(); 为什么在Peagus班 public void horseNoise() { System.out.println("Horse Noise!"); } public v

我是界面概念的初学者

当我浏览有关“通过接口实现多重继承”的信息时,我遇到了以下链接

我和那个学生有同样的疑问

您好,很好的解释在java的uml图中非常有用 鸟和马和动物之间没有联系,为什么?它是 在派生类中使用相同方法所必需的 为什么

void birdNoise(); 
void horseNoise(); 
为什么在Peagus班

public void horseNoise()
{
    System.out.println("Horse Noise!");
}

public void birdNoise()
{ 
    System.out.println("Bird Noise!");
} 
为什么一定有这个?Why“记住,我们必须为接口中的每个方法编写每个类自己的实现。原因?感谢您的解释谢谢

在该帖子中,他们在C++中使用了多重继承,并转换成java的接口。 1.我认为继承是在父类中有一些方法,当其他类中也需要相同的方法时,这些类将继承父类并使用它。 但在接口概念中,如果每个派生类都必须定义自己的实现,那么继承它又有什么用呢

2.如果我们必须提供自己的实现,那么为什么不在派生类本身中定义该方法呢?继承它有什么用

请有人解释一下


谢谢。

< P>当我从C++切换到java时,我有过同样的感觉,但是现在我用java工作了一段时间,这一切都有意义。

1.关于继承,我想到的是在父级中有一些方法 类,以及在其他类中需要相同方法时 同样,这些类将继承父类并使用它

就像原始作者一样,在java中仍然可以做多继承,你必须使用接口。接口就像C++中的纯虚拟类。 但在接口概念中,如果每个派生类必须定义其 自己实现那么继承它有什么用呢

在java中实现接口的原因是为了保证该类具有这些方法,这样就可以让特定类实现泛型接口,然后对实现该泛型接口的每个特定类进行相同的处理


设计与C++设计有点不同,但是在完成几个java程序之后,在使用多继承时,你将变得同样善于使用多个接口。

每个子类必须定义它自己的实现,因为每个子类可能稍微不同地执行操作。:

public interface animal {
    //All implementers must define this method
    void speak();
}
这个接口说明任何动物都必须有说话的方式。基本上,任何类型的动物都能发出声音。然后我们创造了两个子类,或者两种不同类型的动物

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" );
    }
}
在本例中,猫和狗都是动物,因此由于我们的界面,它们必须能够说话。但是,每个人都知道猫和狗发出不同的声音。通过允许每个子类定义它如何“说话”,我们可以在说话()时给狗和猫各自的声音方法,同时确保它们都是动物

更具体地回答您的问题,继承强制子类具有特定的方法。换句话说,接口声明“我的所有子类将定义这些方法中的每一个“。这使我们能够编写代码,在不知道特定子类的情况下处理接口中的方法。我们可以安全地这样做,因为我们知道每个子类都必须在接口类中定义方法。如果只有使用该方法的子类定义了它,那么我们将无法确定在所有子类上调用该方法是否安全

请注意:如果不希望子类定义该方法,只需定义一个空方法,如下所示:

public class MuteAnimal implements animal {
    //A MuteAnimal can't speak!
    public void speak() { }
}

如果没有多态性,继承通常是无用的。仅仅用几句话来解释这一切真的不容易。我的建议是查看定义行为的接口(比如可以做关系),以及is-a关系的具体继承

在你可能学到的每件事的中心是一种叫做单一责任原则的东西。这意味着一个类有一个责任,如果你有更多的责任,你就把这个类分开

如果你拿你的例子来说,即使是飞马座也不是同时是马和鸟的100%。它将继承马,但实现鸟的特定特征,这些特征将在接口中定义,例如Flyable。你们可以说鸟类有一种共同的飞行方式,所以从鸟类身上继承下来。Pegasus有点不同,因此在使用Fly方法实现Flyable接口后,可以定义自定义逻辑。 另外,horseNoise和birdNoise的示例有点不切实际,您需要一个方法speak(),该方法将由于内部类alhorithm而执行某些操作。如果帕伽索斯会说话呢?你能给每个单词一个方法吗

回到Flyable示例,假设您现在有一个视频游戏。现在你们可以得到这个的polimorphism:假设在游戏中地震发生了。你想让每一只会飞的动物都去飞。游戏中目前有一组动物,所以写下:

foreach(Flyable flyableAnimal in animals)
    flyableAnimal.Fly();
你只需要依赖于极化态射


这些只是一些随机的想法,你可以在网上找到更好的例子,希望这有助于…

如果A类继承自B类,这实际上意味着两件事:

  • 类A可以隐式地使用类B的所有方法和属性,并且只需要定义实际上是类A独有的功能。
  • 期望类型为B的对象的代码将接受类型为A的对象。 这两个遗传特征在某种意义上是正交的;可以想象解放军