質問

私の関数は、32ビットが低くて2つの値を含む長い値を返します。

返品値を処理する最良の方法は、長いカスタムタイプを導き出し、getlowerValue()、gethighervalue()などのタイプエクステンダーを提供することだと思いました。

問題は、.NETがLONGから派生することを許可していないことです

それをコンパイルする場合

public class SubmitOrderResult : long
{
}

あなたは得ます:

cannot derive from sealed type 'long'

なぜそれが設計されているのか、どうやってそれを克服できるのですか?

ありがとう

役に立ちましたか?

解決

既に述べたように、.NETの値タイプは密閉されているため、LONGから派生する方法はありません。提案されているように拡張メソッドを作成する必要があります。

public static class LongExtensions
{
    public static long GetLowerValue(this long value)
    {
        ...
    }

    public static long GetHigherValue(this long value)
    {
        ...
    }
}

他のヒント

.NET値タイプのいずれにも導き出すことはできません - それらはすべて定義により封印されています。

おそらく、getlowerValueとgethighervalueメソッドを拡張メソッドとして実装できますか?

私の関数は、32ビットが低くて2つの値を含む長い値を返します。

それは本当に、本当に汚いハックのように聞こえます。それは、金属に近い言語(例:c)に適している可能性がありますが、高レベルのオブジェクト指向言語では適していません。

OO言語では、入札を行うために既存のタイプに嫌がらせをするのではなく、タイプシステムを拡張します。したがって、解決策は、情報を運ぶ新しいタイプを作成することです。

あなたができることは、暗黙的な変換演算子を使用して構造体を書くことです。それはあなたが望む方法で正確に機能します:

public struct SubmitOrderResult
{
    private long _result;

    public SubmitOrderResult(long result)
    {
        _result = result;
    }

    public long Result
    {
        get { return _result; }
        set { _result = value; }
    }

    public int GetHigherValue()
    {
        return (int)(_result >> 32);
    }

    public int GetLowerValue()
    {
        return (int)_result;
    }

    public static implicit operator SubmitOrderResult(long result)
    {
        return new SubmitOrderResult(result);
    }

    public static implicit operator long(SubmitOrderResult result)
    {
        return result._result;
    }
}

その後、あなたはできます:

SubmitOrderResult result = someObject.TheMethod();
Console.WriteLine(result.GetHigherValue());
Console.WriteLine(result.GetLowerValue());

...あなたが望んでいたように。

私が正しく理解していれば、あなたの関数は実際に2つの値を返し、あなたがそれらを梱包するという事実は long 実装の詳細です。その場合、この詳細を非表示にし、値と必要な操作を含むクラスを作成します。

public class SubmitOrderResult
{
    private readonly long value_;

    public int OneValue
    { 
        get { return (int)(value_ >> 32); } 
    }

    public int TheOtherValue
    { 
        get { return (int)(value_ & 0xFFFFFFFF); } 
    }

    public SubmitOrderResult(long value)
    { value_ = value; }
}

あなたはそれを克服することはできません。

として long 密封されたタイプであるため、それらから継承することはできません。を参照してください MSDN

構造体は暗黙的に密閉されているため、継承することはできません。

詳細については、参照してください 継承(C#プログラミングガイド).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top