#c# #type-conversion #adapter
#c# #преобразование типов #адаптер
Вопрос:
И класс адаптера, и целевой класс реализуют один и тот же интерфейс…почему я не могу рассматривать их как один и тот же объект?
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);
Комментарии:
1. Как выглядит интерфейс?
Ответ №1:
Потому что это не один и тот же тип объекта. A BasicFlipPhoneAdapter
это не an iPhone
. Что вы должны уметь делать, так это:
ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
Обратите внимание на тип flipPhoneAdapter
переменной — это ISmartPhone
, не iPhone
.
Комментарии:
1. Это правильная, глупая ошибка с моей стороны. Спасибо за быстрый ответ и разрешение.
Ответ №2:
попробуйте ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
Ответ №3:
Это разные объекты. Но они могут быть сформированы в вашем интерфейсе ISmartPhone. Вы можете привести как свой BasicFlipPhoneAdapter
, так и iPhone
экземпляр к ISmartPhone
и использовать открытую подпись.
Ответ №4:
Поскольку оба являются производными от ISmartPhone
, вы, безусловно, можете рассматривать либо a BasicFlipPhoneAdapter
, либо an iPhone
как ISmartPhone
, например,
ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
Однако вы не можете неявно обрабатывать iPhone
как BasicFlipPhoneAdapter
. Они имеют один и тот же базовый тип, но могут отличаться помимо этого.
Ответ №5:
Это должно быть
ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
iPhone не является супер-типом Basicflipphone Adapter
Ответ №6:
То, что два класса реализуют один и тот же интерфейс, не означает, что они взаимозаменяемы.
iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
недопустимо, потому что вы пытаетесь присвоить переменной типа iPhone
экземпляр class BasicFlipPhoneAdapter
. С другой стороны, у вас могут быть методы, которые работают с любым классом, который реализует интерфейс. Возьмите прототип этой функции:
public void DoSomethingPhoneLike(ISmartPhone phone) {
// ... do things with phone, like phone.ShowTextWithImage()
}
Ответ №7:
Нам нужно больше деталей о том, что ISmartPhone расширяет, чтобы ответить наверняка, но, похоже, вы пытаетесь сказать, что все элементы, которые могут быть «Fliphone», являются iPhone. Основываясь только на предоставленном вами коде, я предполагаю, что все экземпляры «Fliphone» будут ISmartPhone, поэтому, если вы измените
iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
Для
ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);
это должно сработать. Или, если ISmartPhone расширяет IBasicPhone, измените тип flipponeadapeter на IBasicPhone.