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

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top