2010-10-07 67 views
4

我有一個容器類,用於向int,string等標準數據類型添加一些屬性。這個容器類封裝了這樣一個(標準類型)對象的對象。 其他類然後使用容器類的子類來獲取/設置添加的屬性。現在我希望子類可以隱式地在它的封裝對象和自身之間進行轉換,而不需要額外的代碼。如何在C#3.5的超類中定義cast運算符?

這是我的類的一個簡化的例子:

// Container class that encapsulates strings and adds property ToBeChecked 
    // and should define the cast operators for sub classes, too. 
    internal class StringContainer 
    { 
    protected string _str; 

    public bool ToBeChecked { get; set; } 

    public static implicit operator StringContainer(string str) 
    { 
     return new StringContainer { _str = str }; 
    } 

    public static implicit operator string(StringContainer container) 
    { 
     return (container != null) ? container._str : null; 
    } 
    } 

    // An example of many sub classes. Its code should be as short as possible. 
    internal class SubClass : StringContainer 
    { 
    // I want to avoid following cast operator definition 
    // public static implicit operator SubClass(string obj) 
    // { 
    //  return new SubClass() { _str = obj }; 
    // } 
    } 

    // Short code to demosntrate the usings of the implicit casts. 
    internal class MainClass 
    { 
    private static void Main(string[] args) 
    { 
     SubClass subClass = "test string"; // ERROR: Cannot convert source type 'string' to 'SubClass' 

     string testString = subClass; // No error 
    } 
    } 

我的真容器類有兩個類型參數,一個用於封裝的對象的類型(字符串,整數,...)和用於第二子類型(例如SubClass)。

我怎樣才能使代碼

SubClass subClass = "test string"; // ERROR: Cannot convert source type 'string' to 'SubClass' 

可運行在子類最少的代碼?

+0

你爲什麼這樣做?如果要爲現有的基礎數據類型添加功能,那麼爲什麼不使用擴展方法? – 2010-10-07 16:38:30

+2

我沒有得到這個設計.. – vulkanino 2010-10-07 16:41:03

+0

@George Stocker:我需要擴展屬性,因爲我需要將數據保存到封裝對象。 – Markus 2010-10-07 16:47:11

回答

1

我不認爲有一種方法可以在基類中定義轉換運算符。

基類不知道子類的任何內容,所以它沒有足夠的信息來構造它。例如,如果​​類型只有一個需要某些參數的構造函數會怎麼樣?基類不知道子類,所以它不能以任何方式構造它。

也許你可以用另一種方法來參數化StringContainer類型。例如,您可以不使用實現繼承(子類),而是將某些函數(Func<...>類型的代理)傳遞給StringContainer類。這樣,用戶可以參數化類,並且您的隱式轉換仍然可以工作。

+0

@base類不知道有關子類的任何信息:我可以爲子類類型設置一個類型參數。例如。內部類StringContainer Markus 2010-10-07 16:48:26

+0

@Markus:理論上,使用類型參數是一個解決方案,但我不認爲C#將允許您編寫「公共靜態隱式運算符T(..)」,其中「T」是一種類型參數。 – 2010-10-07 18:52:51

+0

謝謝Tomas。我想我會使用這個工作來不使用子類。 – Markus 2010-10-08 07:31:57