Pregunta

Mi función devuelve un valor de largo que contiene dos valores en inferiores y superiores 32 bits.

Me pareció que las mejores maneras de manejar valor de retorno es derivar mi tipo personalizado de largo y proporcionará escriba extensores como GetLowerValue (), GetHigherValue ().

El problema es que .NET no permite derivar de largo

Si compila que

public class SubmitOrderResult : long
{
}

que se obtiene:

cannot derive from sealed type 'long'

¿Por qué es que diseñado de tal manera y cómo puede superarlo?

Gracias

¿Fue útil?

Solución

tipos de valor Como ya se mencionó en .NET están sellados lo que no hay manera que usted puede derivar de largo. Debe crear métodos de extensión como se sugiere.

Ejemplo

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

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

Otros consejos

No se puede derivar de cualquiera de los tipos de .NET Valor - todos ellos son sellados por definición

.

Tal vez usted podría poner en práctica sus métodos GetLowerValue y GetHigherValue como los métodos de extensión?

  

Mi función devuelve un valor de largo que contiene dos valores en inferiores y superiores 32 bits.

Eso suena como un truco muy, muy sucio. Podría ser adecuado para idiomas de cerca a metal (por ejemplo, C), pero no para un lenguaje de alto nivel, orientado a objetos.

En lenguajes orientados a objetos, que se extiende el sistema de tipos, no tipos acosar existentes para hacer su hacer una oferta. Por lo tanto, la solución debe ser la creación de un nuevo tipo que lleva su información.

Lo que puede hacer es escribir una estructura con operadores de conversión implícitas. Eso funcionará exactamente de la manera que desee:

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;
    }
}

A continuación, puede hacer:

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

... al igual que querías.

Si he entendido bien, su función en realidad devuelve dos valores, y el hecho de que ellos empacar en una long es un detalle de implementación. En ese caso, ocultar este detalle y crear una clase que contiene el valor y las operaciones necesarias:

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; }
}

Usted no puede superarlo.

Como long es un tipo sellado y por lo tanto no se puede heredar de ellos. Vea la MSDN

  

Debido estructuras están sellados de forma implícita, que puede no ser heredada.

     

Para obtener más información, consulte herencia (C # Programming Guide) .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top