0

我有一个这样的问题:

想想这样的场景

public class Animal {

    protected String Name;
    Boolean canWork;

}

public class Dog {

  Enum TailType

}

而且我需要在扩展这两个类的第三级类中同时拥有这两个类属性..但是使用接口我认为这无法实现。是否可以使用设计模式或其他方法来做到这一点?

摘要:我想拥有从两个类到一个具体类的属性

4

6 回答 6

3

您可以让 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!" );
    }
}

使用委托/组合和接口,您不需要多重继承。应用和掌握它是一种非常简单的技术,您将构建比单独依赖继承更灵活的系统。

于 2012-12-05T16:54:20.160 回答
2

如果您只想拥有属性,我认为您可以使用以下接口:

interface A{
int a = 0;
}
interface B{
int b = 1;
}
class implements A, B{
//can access A.a and B.b
}

但这不是一个好方法,接口意味着合约不仅仅是包含常量(接口中的变量默认是静态的和最终的)

于 2012-12-05T16:58:13.020 回答
2

出于充分的理由,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);

}
于 2012-12-05T17:00:49.927 回答
2

要实现多重继承,就需要使用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();
      }

 }

希望这可以帮助!!

于 2012-12-05T22:22:06.617 回答
1

Dog应该是 的子类Animal。那么你的第三类将是Dog. 这第三类将具有 和 的Dog属性Animal

如果Dog不是的子类,Animal那么您将需要多重继承来实现您想要的。由于 Java 不支持多重继承,因此您必须Dog创建Animal.


或者,如果您的两个类不在同一个继承层次结构中,那么您有两个选择:-

  • 要么让它们成为接口,然后你就可以实现这两个接口。
  • 或者,使用Composition而不是Inheritance,在这种情况下,您需要同时引用两个类 -AnimalDog, 作为类中的属性。

例如:-

public class YourClass {
    Animal animal;
    Dog dog;
}

但是,拥有AnimalDog类是没有意义的,因为它Dog不是Animal. 所以,你应该先改变它,然后你就可以使用inheritance.

于 2012-12-05T16:47:08.020 回答
1

您可以扩展一个类并将另一个类作为组合,如下所示:

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
}
于 2012-12-05T16:52:11.003 回答