Почему я получаю здесь ошибку преобразования?

#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.