Почему я получаю ошибку преобразования здесь? - PullRequest
0 голосов
/ 11 ноября 2011

И класс адаптера, и целевой класс реализуют один и тот же интерфейс ... почему я не могу рассматривать их как один и тот же объект?

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

Ответы [ 7 ]

8 голосов
/ 11 ноября 2011

Потому что они не того же типа объекта.A BasicFlipPhoneAdapter - это , а не и iPhone.То, что должен иметь возможность сделать, это:

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

Обратите внимание на тип переменной flipPhoneAdapter - это ISmartPhone, а не iPhone.

1 голос
/ 11 ноября 2011

Поскольку оба получены из ISmartPhone, вы, безусловно, можете трактовать либо BasicFlipPhoneAdapter, либо iPhone как ISmartPhone, например,

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

Однако вы не можете неявно трактоватьiPhone как BasicFlipPhoneAdapter.Они имеют одинаковый базовый тип, но могут отличаться от этого.

1 голос
/ 11 ноября 2011

Они не одинаковые объекты . Но они могут быть сформированы в вашем интерфейсе ISmartPhone . Вы можете привести оба экземпляра BasicFlipPhoneAdapter и iPhone к ISmartPhone и использовать открытую подпись.

1 голос
/ 11 ноября 2011

попробуй ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

0 голосов
/ 11 ноября 2011

Нам нужно больше подробностей о том, что ISmartPhone расширяет, чтобы ответить наверняка, но похоже, что вы пытаетесь сказать, что все элементы, которые могут быть «flipPhone», являются iPhone. Основываясь только на предоставленном вами коде, я предполагаю, что все экземпляры "flipPhone" будут ISmartPhone, поэтому если вы измените

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

до

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

это должно работать. Или, если ISmartPhone расширяет IBasicPhone, измените тип flipPhoneAdapeter на IBasicPhone.

0 голосов
/ 11 ноября 2011

То, что два класса реализуют один и тот же интерфейс, не означает, что они взаимозаменяемы.

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

недопустимо, потому что вы пытаетесь присвоить переменной типа iPhone экземпляр класса BasicFlipPhoneAdapter.С другой стороны, вы можете иметь методы, которые работают с любым классом, который реализует интерфейс.Возьмите этот прототип функции:

public void DoSomethingPhoneLike(ISmartPhone phone) {
    // ... do things with phone, like phone.ShowTextWithImage()
}
0 голосов
/ 11 ноября 2011

должно быть

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

iPhone не является супер типом BasicFlipPhoneAdapter

...