2011-11-11 37 views
0

アダプタクラスとターゲットクラスの両方が同じインターフェイスを実装する...なぜ私は、同じオブジェクトのように扱うことができませんか?ここで変換エラーが発生するのはなぜですか?

interface ISmartPhone 
{ 
    string Name { get; set; } 
    string Type { get; set; } 

    void ShowTextWithImage(); 
} 

    public class BasicFlipPhoneAdapter : ISmartPhone 
{ 
    IBasicPhone basicPhone; 
    public BasicFlipPhoneAdapter(IBasicPhone basicPhone) 
    { 
     this.basicPhone = basicPhone; 
    } 

    public string Name { get; set; } 
    public string Type { get; set; } 

    public void ShowTextWithImage() 
    { 
     basicPhone.ShowBasicText(); 
    } 
} 

public class iPhone : ISmartPhone 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 

    public void ShowTextWithImage() 
    { 
     Console.WriteLine("O.o cool image!"); 
    } 
} 

エラーが発生します。

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 
+0

インターフェースはどのようなものが見えますか? – doctorless

答えて

8

のスーパータイプではありませんする必要があります。 BasicFlipPhoneAdapteriPhoneではありません。あなたは行うことができるはずは次のとおりです。

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

flipPhoneAdapter変数の型 - それはISmartPhone、ないiPhoneです。

+0

これは間違いありません。迅速な返信と解決に感謝します。 – dbobrowski

+0

は私が – dbobrowski

+0

ガーを許すとすぐに答えとして受け入れます、あなたはもう一度私を打ち負かしました。 :) Upvoted。 – doctorless

0

それは

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

彼らは同じオブジェクト型ないだからiPhoneがBasicFlipPhoneAdapter

1

は、2つのクラスが、彼らは交換しているという意味ではありません同じインターフェースを実装したからといって

0

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);を試してみてください。

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

あなたがタイプiPhoneクラスBasicFlipPhoneAdapterのインスタンスの変数を割り当てるしようとしているため無効です。一方、インタフェースを実装するすべてのクラスで動作するメソッドを持つことができます。この関数のプロトタイプを取る:

public void DoSomethingPhoneLike(ISmartPhone phone) { 
    // ... do things with phone, like phone.ShowTextWithImage() 
} 
1

彼らは同じオブジェクトではありません。しかし、彼らはあなたのISmartPhoneインタフェースに成形することができます。あなたはISmartPhoneにごBasicFlipPhoneAdapteriPhoneインスタンスの両方をキャストし、露呈した署名を使用することができます。

1

両方がISmartPhoneから派生しているので、あなたは確かに、例えば、

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

しかし、あなたは暗黙的にBasicFlipPhoneAdapterとしてiPhoneを扱うことができない、ISmartPhoneとしてBasicFlipPhoneAdapteriPhoneのいずれかを治療することができます。彼らは同じ基本タイプを持っていますが、それ以外には異なるかもしれません。

0

は、我々はISmartPhoneは確かに答えるために渡ったものの詳細を必要とするが、あなたは「flipPhone」可能性があり、すべての項目がiPhoneであることを言おうとしているように見えます。ただ、コードに基づいて、私はあなたが

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

を変更した場合、それが動作するはずですので、すべての「flipPhone」のインスタンスがISmartPhoneだろうと仮定していました。または、ISmartPhoneがIBasicPhoneを拡張して、flipPhoneAdapeterのタイプをIBasicPhoneに変更します。

関連する問題