2011-11-11 27 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

因为他们是相同的对象类型。 A BasicFlipPhoneAdapter而不是iPhone。你应该能够做的是:

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

注意flipPhoneAdapter变量的类型 - 这是ISmartPhone,不iPhone

+0

这是对的,我的错误是愚蠢的。感谢您的快速回复和解决方案。 – dbobrowski

+0

只要它允许我接受答案 – dbobrowski

+0

嘎,你再次击败我,Skeet先生。 :) Upvoted。 – doctorless

0

应该

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

iPhone是不是超级型BasicFlipPhoneAdapter

1

尝试ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

0

只是因为两个类实现相同的接口并不意味着他们是可以互换的。

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

因为你想分配型iPhoneBasicFlipPhoneAdapter类的实例的变量是无效的。另一方面,你可以使用任何实现接口的类来操作方法。把这个函数原型:

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

他们不一样对象。但它们可以在您的ISmartPhone接口中成形。您可以将BasicFlipPhoneAdapteriPhone实例都投射到ISmartPhone并使用公开的签名。

1

因为它们都是从ISmartPhone衍生,你当然可以把无论是BasicFlipPhoneAdapteriPhone作为ISmartPhone,例如,

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

但是,您不能隐式处理的iPhoneBasicFlipPhoneAdapter。它们具有相同的基本类型,但除此之外可以有所不同。

0

我们需要更多关于ISmartPhone延伸回答的详细信息,但看起来您试图说所有可能是“flipPhone”的物品都是iPhone。基于刚才的代码你提供我假设所有的“flipPhone”情况下将是一个ISmartPhone所以如果你改变

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

它应该工作。或者,如果ISmartPhone确实扩展了IBasicPhone,则将flipPhoneAdapeter的类型更改为IBasicPhone。

相关问题