سؤال

ولدي ج # فئة لديها الكثير من الطرق الافتراضية، وبعض من هذه الأساليب هي مجردة أساسا (وتنفيذها بالكامل في الفئات الفرعية والفئة الأساسية فارغ).

لحملها على تجميع أنا رمي على InvalidOperationException في الفئة الأساسية مع تعليق على ما ينبغي القيام به. هذا يشعر فقط القذرة.

هل هناك طريقة أفضل لتصميم دروسي؟

وتحرير: ولالطبقة الوسطى من أحد التطبيقات التي سيتم ركض في كندا، ونصف من طرق وعام وبالتالي الظاهري. ونصف من الطرق والمحافظة محددة.

Public class PersonComponent() 
{

 public GetPersonById(Guid id) {
  //Code to get person - same for all provinces
 }

 Public virtual DeletePerson(Guid id) {
  //Common code
 }

 Public virtual UpdatePerson(Person p) {
  throw new InvalidOperation("I wanna be abstract");
 }

Public Class ABPersonComponent : PersonComponent
{
    public override DeletePerson(Guid id) 
    {
       //alberta specific delete code
    }

    public override UpdatePerson(Person p) 
    {
       //alberta specific update codecode
    }

}

ونأمل أن يكون هذا الأمر يبدو معقولا تماما

هل كانت مفيدة؟

المحلول

والتفكير في التسلسل الهرمي الكائن. هل ترغب في مشاركة مدونة مشتركة لجميع فئات مشتقة، ثم تنفيذ وظائف قاعدة في الفئة الأساسية.

عند وجود كود قاعدة مشتركة، من فضلك لاحظ نمط القالب. استخدام أسلوب العام والسلسلة إلى أسلوب ظاهري محمية مع تنفيذ الأساسية / المشتركة. إنهاء METHODNAME التنفيذ المشترك مع "الأساسية".

وعلى سبيل المثال:

public abstract class BaseClass
{
    protected virtual void DeletePersonCore(Guid id)
    {
        //shared code
    }

    public void DeletePerson(Guid id)
    {
        //chain it to the core
        DeletePersonCore(id);
    }
}

public class DerivedClass : BaseClass
{
    protected override void DeletePersonCore(Guid id)
    {
        //do some polymorphistic stuff

        base.DeletePersonCore(id);
    }
}

public class UsageClass
{
    public void Delete()
    {
        DerivedClass dc = new DerivedClass();

        dc.DeletePerson(Guid.NewGuid());
    }
}

نصائح أخرى

الأقسام الفئة الأساسية كما مجردة، وكذلك الطرق التي ليس لها التنفيذ.

ومثل ذلك

public abstract class BaseClass
{

    public abstract void AbstractMethod();
}

public class SubClass: BaseClass
{
    public override void AbstractMethod()
    {
        //Do Something
    }
}

وأنت لا يمكن أن يكون أساليب مجردة خارج فئة مجردة. بمناسبة فئة مجردة كما يعني أنك لن تكون قادرا على إنشاء مثيل له. ولكن بعد ذلك لا يجعل أي معنى ل. ما كنت تنوي القيام به مع فئة التي لا يطبق طرق على أية حال؟

تعديل: من النظر في صفك، نعم فما استقاموا لكم فاستقيموا جعل PersonComponent مجردة جنبا إلى جنب مع أسلوب UpdatePerson. إما أن، أو إذا UpdatePerson فقط لا تفعل أي شيء لPersonComponent الحفاظ عليه كما هو، ولكن جعل طريقة UpdatePerson فارغة لPersonComponent.

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