なぜ私は長いことに由来することができないのですか?
-
21-09-2019 - |
質問
私の関数は、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#プログラミングガイド).