2016-05-16 3 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 

それは可能ですか? (任意のアクセサなし)変数 "myVarに" の値を返さなければなりません "e" を使用して

デフォルト

+0

まず、あなたはそれを無制限の構造体にする方がよいでしょう。しかし、本当にあなたは単にダブルで拡張メソッドを作成することができます。 FYI '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型のメソッドであるように見せます。 など。