Warum kann ich nicht lange ableiten?
-
21-09-2019 - |
Frage
Meine Funktion gibt einen langen Wert zurück, der zwei Werte in niedrigeren und höheren 32 Bit enthält.
Ich dachte, die besten Möglichkeiten, den Rückkehrwert zu handhaben, besteht darin, meinen benutzerdefinierten Typ von Long abzuleiten und Typ -Erweiterungen wie GetlowerValue (), Gethervalue () bereitzustellen.
Das Problem ist, dass .NET nicht zulässt, von Long abzuleiten
Wenn Sie das kompilieren
public class SubmitOrderResult : long
{
}
du erhältst:
cannot derive from sealed type 'long'
Warum ist das so gestaltet, dass es so und wie kann es überwinden?
Vielen Dank
Lösung
Wie bereits erwähnte Werttypen in .NET sind versiegelt, sodass Sie keine Möglichkeit haben, von langem abzuleiten. Sie sollten wie vorgeschlagene Erweiterungsmethoden erstellen.
Beispiel
public static class LongExtensions
{
public static long GetLowerValue(this long value)
{
...
}
public static long GetHigherValue(this long value)
{
...
}
}
Andere Tipps
Sie können von einem der .NET -Werttypen nicht abgeleitet - sie sind alle per Definition versiegelt.
Vielleicht könnten Sie Ihre GetlowerValue- und Gethighervalue -Methoden als Erweiterungsmethoden implementieren?
Meine Funktion gibt einen langen Wert zurück, der zwei Werte in niedrigeren und höheren 32 Bit enthält.
Das klingt nach einem sehr, sehr schmutzigen Hack. Es könnte für nahezu metale Sprachen (z. B.) geeignet sein, jedoch nicht für eine höhere, objektorientierte Sprache.
In OO -Sprachen erweitern Sie das Typsystem und belästigen nicht vorhandene Typen, um Ihr Gebot abzugeben. Daher sollte die Lösung darin bestehen, einen neuen Typ zu erstellen, der Ihre Informationen enthält.
Was Sie tun können, ist eine Struktur mit impliziten Conversion -Operatoren zu schreiben. Das funktioniert genau so, wie Sie möchten:
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;
}
}
Dann können Sie:
SubmitOrderResult result = someObject.TheMethod();
Console.WriteLine(result.GetHigherValue());
Console.WriteLine(result.GetLowerValue());
... genau wie du wolltest.
Wenn ich richtig verstehe, gibt Ihre Funktion tatsächlich zwei Werte zurück und die Tatsache, dass Sie sie in a packen long
ist ein Implementierungsdetail. Verstecke dieses Detail in diesem Fall und erstelle eine Klasse, die den Wert und die erforderlichen Vorgänge enthält:
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; }
}
Sie können es nicht überwinden.
Wie long
ist ein versiegelter Typ und deshalb können Sie nicht von ihnen erben. Siehe das Msdn
Da Strukturen implizit versiegelt sind, können sie nicht vererbt werden.
Weitere Informationen finden Sie unter Vererbung (C# Programmierhandbuch).