2016-10-24 8 views
1

私はデザインパターンを理解しようとしています、と私は 次のように、私が実装されたインタフェースクラスのクラス名を取得する方法 を知っておく必要があります。戦略のデザインパターンでオブジェクトのクラス名を取得

public interface Flys { 

    String fly(); 

} 

// Class used if the Animal can fly 

class ItFlys implements Flys{ 

    public String fly() { 

     return getClass().getName()+" is Flying High"; //not working...gives me the ItFlys class name not Dog class name 

    } 

} 

//Class used if the Animal can't fly 

class CantFly implements Flys{ 

    public String fly() { 

     return "I can't fly"; 

    } 

} 

コードから:http://www.newthinktank.com/2012/08/strategy-design-pattern-tutorial/ おかげ

+0

あなたの 'Dog'クラスはどこですか? - デバッグのヘルプを求める質問(** "なぜこのコードは動作しないのですか?")**は、問題の内容に*特定の問題やエラー、それを再現するのに必要な最短コード**を含める必要があります** 。 **明確な問題文**のない質問は他の読者には役に立たない。参照してください:[最小、完全、および検証可能な例を作成する方法](http://stackoverflow.com/help/mcve) –

+0

@ JonnyHenly私はリンクが有用であると思います。ここに)私は非常に明確な問題を提示した。あなたはいくつかのデザインパターンを知っているなら、あなたはリンクが必要ないだろう;) – Alexis

答えて

0

それはそれを囲むクラスの名前を取得しますので、この行はItFlys classに封入されています。

return getClass().getName()+" is Flying High"; 

オブジェクトのインスタンスが利用可能な場合、そのクラスを取得する最も簡単な方法は、Object.getClass()を呼び出すことです。もちろん、これはObjectをすべて継承する参照型に対してのみ機能します。 getName()は、あなたが直面している問題がDogBirdどちらもFlysを実装することで返さString

2

にパッケージ名が含まれます:あなたのDog.javaと仮定するとObject、あなたは以下の

return new Dog().getClass().getSimpleName() + " is Flying High"; 

編集をしたいと思うの継承しますインタフェース。代わりに、各クラスにはの実装が含まれています。 ItFlysはわからないので、設計上、どのクラスに含まれているのか、fly()を呼び出すと、それ以外のクラスを検出することはできません。

あなたは、「所有者」を表すObjectを取るためにfly方法を変更することで問題を解決し、所有者のクラスにgetNameを呼び出すことができます。今すぐ

public interface Flys { 
    String fly(Object owner); 
} 

// Class used if the Animal can fly 
class ItFlys implements Flys{ 
    public String fly(Object owner) { 
     return owner.getClass().getName()+" is Flying High"; 
    } 
} 

Dogは、その前方fly()方法の独自の実装を提供する必要がありますその呼出しはflyingType

public String fly() { 
    flyingType.fly(this); 
} 
+0

ありがとう、非常に有用な:) – Alexis

関連する問題