[英]Java multiple inheritance issue
我有这样一个问题:
考虑这样的情况
public class Animal {
protected String Name;
Boolean canWork;
}
public class Dog {
Enum TailType
}
我需要在扩展这两个类的第三级类中都具有这两个类属性,但是使用接口我认为这是无法实现的。 是否可以使用设计模式或其他方法来执行此操作?
摘要:我希望具有从两个类到一个具体类的属性
您可以让Dog扩展Animal,然后再将Dog扩展到第三类,但是除非您的3类是Poodle,否则您可能会遇到尚未意识到的问题。 仅当关系是建模标准时才需要继承,而仅扩展对象以获得其功能是错误的方法。 继承应遵循IS-A原则。 在建模方面,这就是您的子类IS-A基类。 如果没有通过该测试,则您应该使用继承。 毕竟,您可以使用委托来获取其功能。 意思是:
public class SomeClass {
private Dog dog;
public void bark() {
dog.bark(); // this is reusing the functionality without extending
}
}
现在SomeClass可以在不扩展Dog的情况下调用或调用方法。 现在,它的缺点是对Dog的引用不能指向SomeClass,但是如果SomeClass不是-Dog,那可能很好。 但是,如果您必须允许Dog和SomeClass共享某些类型,以便您可以拥有指向Dog或SomeClass的引用,则可以创建一个共享以下内容的接口:
public class SomeClass implements Barkable {
private Dog dog;
@Override
public void bark() {
dog.bark();
}
}
public class Dog implements Barkable {
@Override
public void bark() {
System.out.println( "Bark! Bark!" );
}
}
使用委托/组成和接口,您不需要多重继承。 这是应用和掌握的一种非常简单的技术,您将构建比仅依赖继承要灵活得多的系统。
如果您尝试仅具有属性,我认为您可以使用如下接口:
interface A{
int a = 0;
}
interface B{
int b = 1;
}
class implements A, B{
//can access A.a and B.b
}
但这不是一个好方法,接口不仅仅用于包含常量的接口(默认情况下,接口中的变量是静态的和最终的)
出于充分的原因,现代的OO语言(如Java和C#)不支持多重继承。
在大多数情况下使用的替代品是接口:
public Interface NameAndWorkable {
setName(String name)
String getName();
boolean canWork();
setCanWork(boolean canWork);
}
public Interface TailAnimal {
TailtypeEnum getTailType();
setTailType(TailtypeEnum tailtype);
}
public class Animal implements NameAndWorkable {
private String name;
private boolean canWork;
public setName(String name)
public String getName();
public boolean canWork();
public setCanWork(boolean canWork);
}
public class Dog implements TailAnimal {
private TailTypeEnum tailType;
public TailtypeEnum getTailType();
public setTailType(TailtypeEnum tailtype);
}
现在,第三个对象完全填充了两个接口
public class WorkingNamedDog implements NameAndWorkable, TailAnimal {
private String name;
private boolean canWork;
private TailTypeEnum tailType;
// from NameAndWorkable
public setName(String name)
public String getName();
public boolean canWork();
public setCanWork(boolean canWork);
// from TailAnimal
public TailtypeEnum getTailType();
public setTailType(TailtypeEnum tailtype);
}
要实现多重继承,必须使用接口。 您可以通过将这些类彼此扩展来使用继承,例如:
//Your first class
public abstract class Animal{
//It is upto you to use an abstract method inside it. However it is not necessary to do so!
//define an abstract method inside an abstract class.
}
//Your second class
public class Dog extends Animal{
}
//Your third class
public class ThirdClass extends Dog{
//here you can instantiate Dog
private Dog dogObject = new Dog();
public void anyMethod(){
dogObject.anyMethodsThatAreDefinedInClassDogAndAnimal();
}
}
希望这可以帮助!!
Dog
应该是Animal
的子类。 那么您的第三类将是Dog
的子类。 第三类将具有Dog
和Animal
的属性。
如果Dog
不是Animal
的子类,则您需要多重继承才能实现所需的功能。 由于Java不支持多重继承,因此必须使Dog
成为Animal
的子类。
或者,如果您的两个类不在同一继承层次结构中,那么您有两个选择:-
Animal
和Dog
的引用作为类中的属性。 例如:-
public class YourClass {
Animal animal;
Dog dog;
}
但是,拥有Animal
和Dog
类没有意义,因为Dog
不是Animal
的子类。 因此,您应该先进行更改,然后才能使用inheritance
。
您可以扩展一个类,让另一个类作为组合,如下所示:
public class MyClass extends Dog {
private Animal animal; // instance of Animal class
// rest of the code to expose Animal class's attributes as per your need
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.