为什么这里会出现转换错误
本文关键字:转换 错误 这里 为什么 | 更新日期: 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界面中被塑造。您可以将BasicFlipPhoneAdapter
和iPhone
实例强制转换为ISmartPhone
,并使用公开的签名。
由于两者都派生自ISmartPhone
,您当然可以将BasicFlipPhoneAdapter
和iPhone
视为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。