簡體   English   中英

為重載方法將對象轉換為適當的類型

[英]Cast object into appropriate type for overloaded methods

說我有一個被重載的方法,例如void PrintInfo(Person)void PrintInfo(Item)等等。 我嘗試通過傳入一個對象來調用這些方法。

我想知道為什么這樣做會給我一個錯誤。 不是所有的類都繼承自Object嗎? 我想避免在調用適當的方法之前執行if / switch語句來檢查對象是哪種類型。

你們認為這種情況下最好的方法是什么?

所有的Person都是object ,但並非所有的object都是Person 因此,您可以將Person傳遞給接受object的方法,但不能將object傳遞給需要Person的方法。

聽起來您要使用的各種對象之間有一些共同的功能。 鑒於此,最好找到一個擁有您所需的所有功能的共同祖先,或者一個由它們共同實現的接口(再次提供您所需的一切)。

在打印的情況下,您可能只需要ToString方法。 在這種情況下,您只需讓該方法接受一個object並對其調用ToString (這就是許多打印方法的功能,例如Console.WriteLine

您需要了解,因為C#是靜態類型的語言( dynamic禁止),所以選擇的特定重載(稱為重載解析 )是在編譯時而不是運行時確定的。 這意味着編譯器需要能夠明確確定參數是什么類型。 考慮:

Object foo;
foo = "String";
foo = 5;
PrintInfo(foo); // Which overload of printinfo should be called?  The compiler doesn't know!

有幾種方法可以解決這一問題-使dynamic類型的foo為單-會導致在編譯時選擇正確的重載。 這樣做的問題是您失去了類型安全性-如果您沒有適當的重載類型,則您的應用程序仍將編譯,但是當您嘗試打印不受支持的類型信息時會崩潰。

一種可以說是更好的方法是確保foo始終是正確的類型,而不僅僅是Object

正如@Servy所建議的,另一種方法是將行為附加到類型本身。 例如,您可以創建一個接口IHasPrintInfo

public interface IHasPrintInfo { String PrintInfo { get; } }

並在您可能會打印其信息的所有項目上實現該界面。 然后,您的PrintInfo函數就可以使用IPrintInfo:

public void PrintInfo(IPrintInfo info) { 
    Console.WriteLine(info.PrintInfo);
}

這里對編譯器含糊不清; 編譯器無法確定您打算調用哪個版本的方法(人員/項目)。

暫無
暫無

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

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