我有一个这样的问题:
想想这样的场景
public class Animal {
protected String Name;
Boolean canWork;
}
public class Dog {
Enum TailType
}
而且我需要在扩展这两个类的第三级类中同时拥有这两个类属性..但是使用接口我认为这无法实现。是否可以使用设计模式或其他方法来做到这一点?
摘要:我想拥有从两个类到一个具体类的属性
您可以让 Dog 扩展 Animal,然后将 Dog 扩展为第三类,但除非您的第三类是贵宾犬,否则您可能会遇到尚未意识到的问题。仅当关系是建模标准时才适合继承,并且仅扩展对象以获取其功能是错误的方法。继承应该遵循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
}
但这不是一个好方法,接口意味着合约不仅仅是包含常量(接口中的变量默认是静态的和最终的)
出于充分的理由,Java 和 C# 等现代 OO 语言不支持多重继承。
大多数情况下要使用的替换是接口:
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);
}
要实现多重继承,就需要使用Interfaces。您可以通过将这些类相互扩展来使用继承,例如:
//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
}