لماذا لا أستطيع الاستخلاص من فترة طويلة؟
-
21-09-2019 - |
سؤال
تقوم وظيفتي بإرجاع بعض القيمة الطويلة التي تحتوي على قيمتين في 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#).