2016-05-16 73 views
0

我想添加一些函數來雙重類型。我創建了新的類「ExtraDouble」,我想讓課程表現爲雙重行爲。C#繼承後雙

例如:我有:

class ExtraDouble{ 
double myVar = 0.59; 
} 

,並且凡:

Extradouble e = new Extradouble(); 
String.Format("Value of e is: {0}", e) // return: Value of e is: 0.59 

這可能嗎?使用的 「e」 必須返回變量 「myVar的」 的值(沒有任何訪問器)

默認

+0

首先,你可能會更好使它成爲一個不可修改的結構。但是,你真的可以在'double'上創建擴展方法。僅供參考'String.Format'將調用'ToString',所以你只需重寫它並返回'myVar.ToString()'。 – juharr

回答

3

是。所有對象都有一個虛擬的ToString方法。對於你的情況,只是重寫:

class ExtraDouble 
{ 
    double myVar = 0.59; 

    public override string ToString() 
    { 
     return myVar.ToString(); 
    }   
} 

更多完整性。如果你希望你的ExtraDouble表現爲中常見的場景雙(如執行算術運算),你可以使用implicit關鍵字:

class ExtraDouble : Object 
{ 
    double myVar = 0.59; 

    public override string ToString() 
    { 
     return myVar.ToString(); 
    } 

    public static implicit operator double(ExtraDouble d) 
    { 
     return d.myVar; 
    } 
} 

然後,你可以做這樣的事情:

Console.WriteLine(5 * new ExtraDouble()); 
+0

好的。但是,如果我想使用 - 例如:e * e,我必須重寫其他方法,是的?沒有任何獨特的方法? – mathemaniac00

+0

很確定我的回答涵蓋了你的問題。不,轉換爲字符串並隱式轉換爲double不能組合成通用方法 – Jonesopolis

+0

@ mathemaniac00如果執行'ExtraDouble * ExtraDouble'並且沒有'operator *'重載,編譯器將使用隱式運算符,所以它會工作得很好! – Chris

0

如果我理解你的問題是正確的,你想要類的行爲像一個雙重但功能擴展。你可以看看對象擴展。它們旨在擴展通常無法繼承的類。

public static class DoubleExtension 
{ 
    public static double Sqr(this double d) 
    { 
     return d * d; 
    } 
} 

這會使它看起來像Sqr()是double類型的方法。 例如

double d = 2.0f; 
double sqrD = d.Sqr(); 
// This value will now be 4. This call looks like a class method but its not, it's an extension