0

私はこのような質問があります:

このようなシナリオを考えてください

public class Animal {

    protected String Name;
    Boolean canWork;

}

public class Dog {

  Enum TailType

}

そして、両方のクラスを拡張する第3レベルのクラスに、このクラスの両方の属性を含める必要があります。しかし、インターフェイスを使用すると、これを実現できるとは思いません。デザインパターンやその他の方法を使用してこれを行うことは可能ですか?

まとめ:2つのクラスから具体的なクラスへの属性が欲しい

4

6 に答える 6

3

DogにAnimalを拡張させてから、3番目のクラスでDogを拡張させることもできますが、3番目のクラスがPoodleでない限り、まだ気付いていない問題が発生する可能性があります。継承であることが適切なのは、関係がモデリング基準である場合のみであり、オブジェクトを拡張して機能を取得することは間違ったアプローチです。継承はIS-Aの原則に従う必要があります。それがあなたのサブクラスですIS-モデリング用語の基本クラス。そのテストに合格しない場合は、合格すべきでないときに継承を使用しています。結局のところ、委任を使用してそれらの機能を取得できます。その意味:

public class SomeClass {

    private Dog dog;

    public void bark() {
       dog.bark();  // this is reusing the functionality without extending
    }
}

これで、SomeClassは、Dogを拡張せずに、Dogのメソッドを呼び出したり呼び出すことができます。これの欠点は、Dogへの参照がSomeClassを指すことができないことですが、SomeClassがそうでない場合は、おそらく良い犬です。ただし、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

正当な理由で、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);
}

そして今、両方のインターフェースを埋める3番目のオブジェクト

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

属性だけを作成しようとしている場合は、次のようなインターフェイスを使用できると思います。

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

多重継承を実現するには、インターフェースを使用する必要があります。次のように、これらのクラスを相互に拡張することにより、継承を使用できます。

//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ます。次に、3番目のクラスはのサブクラスになりDogます。この3番目のクラスには、との属性がDogありAnimalます。

Dogがのサブクラスでない場合は、Animal目的を達成するために多重継承が必要になります。Javaは多重継承をサポートしていないためDog、のサブクラスを作成する必要がありAnimalます。


または、2つのクラスが同じ継承階層にない場合は、次の2つのオプションがあります。

  • それらをインターフェースにしてから、両方のインターフェースを実装できます。
  • または、継承の代わりにコンポジションを使用します。この場合、クラスの属性として、クラスとの両方への参照が必要になります。AnimalDog

例:-

public class YourClass {
    Animal animal;
    Dog dog;
}

ただし、のサブクラスではないため、持っAnimalDogクラス化することは意味がありません。したがって、最初にそれを変更する必要があります。そうすれば、を使用できるようになります。DogAnimalinheritance

于 2012-12-05T16:47:08.020 に答える
1

次のように、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 に答える