适配器类和目标类都实现了相同的接口...为什么我不能将它们视为同一个对象?
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 :(得分:8)
因为他们不是相同的对象类型。 BasicFlipPhoneAdapter
不 iPhone
。您应该能够做的是:
ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
请注意flipPhoneAdapter
变量的类型 - 它是ISmartPhone
,而不是iPhone
。
答案 1 :(得分:1)
尝试ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
答案 2 :(得分:1)
它们不是同一个对象。但它们可以在 ISmartPhone界面中形成。您可以将BasicFlipPhoneAdapter
和iPhone
实例同时转换为ISmartPhone
并使用公开的签名。
答案 3 :(得分:1)
由于两者都来自ISmartPhone
,因此您当然可以将BasicFlipPhoneAdapter
和iPhone
视为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。