簡體   English   中英

為什么在這里出現轉換錯誤?

[英]Why am I getting a conversion error here?

適配器類和目標類都實現相同的接口...為什么不能將它們視為相同的對象?

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

嘗試ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone);

它們不是同一對象 但是它們可以在您的ISmartPhone界面中成形。 您可以將BasicFlipPhoneAdapteriPhone實例都轉換為ISmartPhone並使用公開的簽名。

由於兩者均源自ISmartPhone ,因此您當然可以將BasicFlipPhoneAdapteriPhone視為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()
}

我們肯定需要有關ISmartPhone擴展內容的更多詳細信息,但是您似乎想說的是所有可能是“ flipPhone”的物品都是iPhone。 僅基於您提供的代碼,我假設所有“ flipPhone”實例均為ISmartPhone,因此如果您進行更改,

iPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

ISmartPhone flipPhoneAdapter = new BasicFlipPhoneAdapter(flipPhone); 

它應該工作。 或者,如果ISmartPhone確實擴展了IBasicPhone,則將flipPhoneAdapeter的類型更改為IBasicPhone。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM