为什么这里会出现转换错误

本文关键字:转换 错误 这里 为什么 | 更新日期: 2023-09-27 18:14:21

适配器类和目标类实现相同的接口…为什么我不能把它们当作同一个物体来对待呢?

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

为什么这里会出现转换错误

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

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

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

try ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

它们不是相同的对象。但是它们可以在你的ISmartPhone界面中被塑造。您可以将BasicFlipPhoneAdapteriPhone实例强制转换为ISmartPhone,并使用公开的签名。

由于两者都派生自ISmartPhone,您当然可以将BasicFlipPhoneAdapteriPhone视为ISmartPhone,例如

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

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

应该是

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

iPhone不是BasicFlipPhoneAdapter的超类型

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

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

无效,因为您试图将iPhone类型的变量分配给BasicFlipPhoneAdapter类的实例。另一方面,你可以拥有对实现接口的任何类进行操作的方法。以这个函数原型为例:

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

我们需要更多关于智能手机扩展的细节来确定答案,但看起来你想说所有可能是"flipPhone"的产品都是iPhone。根据你提供的代码,我假设所有的"flipPhone"实例都是一个智能手机,所以如果你修改

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

应该可以。或者如果ISmartPhone确实扩展了IBasicPhone,那么将flipphoneadapter的类型更改为IBasicPhone。