سؤال

معطى هذه الفئات 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();
    }
}

من الواضح أنه مجرد مثال ، لا تعرف ما الذي يفعله المقبض المعدني والمقبض ، لكنه يمكن أن يعمل بشكل جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top