为什么我在这里收到转换错误?

时间:2011-11-11 18:44:44

标签: c# type-conversion adapter

适配器类和目标类都实现了相同的接口...为什么我不能将它们视为同一个对象?

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);

7 个答案:

答案 0 :(得分:8)

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

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

请注意flipPhoneAdapter变量的类型 - 它是ISmartPhone,而不是iPhone

答案 1 :(得分:1)

尝试ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

答案 2 :(得分:1)

它们不是同一个对象。但它们可以在 ISmartPhone界面中形成。您可以将BasicFlipPhoneAdapteriPhone实例同时转换为ISmartPhone并使用公开的签名。

答案 3 :(得分:1)

由于两者都来自ISmartPhone,因此您当然可以将BasicFlipPhoneAdapteriPhone视为ISmartPhone,例如,

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

但是,您无法隐式将iPhone视为BasicFlipPhoneAdapter。它们具有相同的基本类型,但除此之外可以有所不同。

答案 4 :(得分:0)

应该是

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

iPhone不是BasicFlipPhoneAdapter的超级类型

答案 5 :(得分:0)

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

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

无效,因为您尝试为iPhone类型的变量分配类BasicFlipPhoneAdapter的实例。另一方面,您可以拥有在任何实现接口的类上操作的方法。拿这个函数原型:

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

答案 6 :(得分:0)

我们需要更多有关ISmartPhone延伸回答的详细信息,但看起来您试图说所有可能是“flipPhone”的项目都是iPhone。基于您提供的代码,我假设所有“flipPhone”实例都是ISmartPhone,所以如果您更改

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

它应该有用。或者,如果ISmartPhone确实扩展了IBasicPhone,那么将flipPhoneAdapeter的类型更改为IBasicPhone。