سؤال

تقوم وظيفتي بإرجاع بعض القيمة الطويلة التي تحتوي على قيمتين في 32 بت أقل وأعلى.

اعتقدت أن أفضل الطرق للتعامل مع قيمة الإرجاع هي استخلاص نوعي المخصص من طويل وتوفير موسع نوع مثل getLowerValue () ، Gethighervalue ().

المشكلة هي أن .NET لا يسمح بالاشتقاق من فترة طويلة

إذا قمت بتجميع ذلك

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 بت أقل وأعلى.

هذا يبدو وكأنه اختراق حقا ، حقا قذرة. قد يكون ذلك مناسبًا للغات القريبة من المعدن (على سبيل المثال 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());

... تماما كما تريد.

إذا فهمت بشكل صحيح ، فإن وظيفتك تُرجع قيمتين فعليتين ، وحقيقة أنك تحزمهما في 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