الفئات المشتقة كقيمة إرجاع
-
26-09-2019 - |
سؤال
معطى هذه الفئات C# (التي تم إنشاؤها بواسطة WCF ، لا أستطيع تغيير هذه):
public SysState GetSysState();
public class SysState { /* nothing much here */}
public class Normal : SysState { /* properties & methods */ }
public class Foobar : SysState { /* different properties & methods */ }
رمز بلدي (حالياً):
SysState result = GetSysState();
if (result is Normal) HandleNormal((Normal) result);
if (result is Foobar) HandleFoobar((Foobar) result);
سؤالي: ما زلت أشعر أنني في عداد المفقودين شيئًا واضحًا ، ولا أحتاج إلى التحقق من النوع بشكل صريح. هل أواجه لحظة كبار؟
المحلول
استخدم طريقة افتراضية. ضع الكود الخاص بك في الفئات التي يعملون عليها ، وليس في بعض التعليمات البرمجية التي تحصل على إشارة إلى الفصل.
public class SysState {
/* nothing much here, except...: */
public abstract virtual void DoSomething();
}
public class Normal : SysState {
/* properties & methods */
public override void DoSomething()
{
// ...
}
}
public class Foobar : SysState {
/* different properties & methods */
public override void DoSomething()
{
// ...
}
}
SysState result = SomeFunctionThatReturnsObjectDerivedFromSysState();
result.DoSomething();
سيؤدي ذلك إلى تنفيذ طريقة dosomething للفئة المشتقة. وهذا ما يسمى تعدد الأشكال ، وهو الأكثر طبيعية (والبعض يجادل هو الوحيد صحيح) استخدام الميراث.
يرجى ملاحظة أن sysstate.dosomething لا يجب أن يكون مجردة لهذا العمل ، ولكن يجب أن تكون افتراضية.
نصائح أخرى
قد تحاول الجمع handleX
ووضع Handle
في SysState
وإفراط في ركوبها في كليهما Normal
و Foobar
لأداء مهام محددة. قد لا يكون الحل الأمثل ، لكنه سيبدو أنيقًا نسبيًا. إذا كنت بحاجة إلى إدخال البيانات من مصادر أخرى ، فالمرض كمعلمات؟
public class SysState
{
public bool Process(Information info)
{
return ( info.Good );
}
}
public class Normal
{
public bool Process(Information info)
{
return doStuff();
}
}
public class Foobar
{
public bool Process(Information info)
{
return diePainfully();
}
}
من الواضح أنه مجرد مثال ، لا تعرف ما الذي يفعله المقبض المعدني والمقبض ، لكنه يمكن أن يعمل بشكل جيد.