"الفئة التجريدية" مقابل "الطبقة العادية" لمكتبة قابلة لإعادة الاستخدام

StackOverflow https://stackoverflow.com/questions/2807672

سؤال

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

سؤال: هل هناك أي سبب في الواقع يجب أن أستخدم فئة مجردة هنا بدلاً من مجرد فصل عادي؟

ملاحظة - لقد قررت بالفعل أنني لا أرغب في استخدام واجهات لأنني أرغب في تضمين الأساليب الافتراضية الفعلية في مكتبتي حتى لا يضطر العميل الذي يستخدمه إلى كتابة الرمز.

تحرير: لذلك أنا أصطاد أي مزايا لا يمكنني التفكير فيها. على سبيل المثال عند ترقية المكتبة ، ستستخدم تأثير فئة مجردة على رمز العميل - لا يمكنني رؤيته في هذه الحالة لا؟

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

المحلول

ما لم تكن ترغب في إجبار المستخدمين النهائيين على الوراثة من فصولك ، يجب ألا يكون هناك سبب للاستخدام نبذة مختصرة.

إذا كنت ترغب في جعل فصولك وراثيًا وقابلة للتمديد بسهولة ، فاستخدم افتراضية على أساليبك وتأكد من أن لديك قابلاً للاستخدام محمي المنشئون.

نصائح أخرى

الدافع وراء الطبقة التجريدية هو مطالبة العملاء بتجاوز الفصل. قرارك بشأن ما إذا كان يجب أن يكون الفصل مجردة أم لا يعتمد بشكل أساسي على ما إذا كان الملخص يفتقد بعض السلوك الأساسي الذي يمكن لمستخدمه فقط توفيره.

يمكنك عادة إخبارك بأنك تحتاج إلى أن تكون صفك مجردة إذا كنت تستخدم طريقة قالب من نوع ما ، حيث يكمل "توصيل الثقب في هذا السلوك" منطق فئة HE. إذا كان فصلك مفيدًا بدون بعض المنطق الذي يقدمه المستخدم ، فربما لا تحتاج إلى أن يكون الفصل مجردًا.

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

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

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

الفرق بين الطبقة المجردة والرقم غير المنبثق هو أنه لا يمكنك إنشاء إنشاء السابق ويجب تجاوزه. الأمر متروك لك حقًا لتحديد ما إذا كان مثيل الفئة الأساسية منطقية أم لا.

اسمحوا لي أن أريكم حالتين. واحد هو المكان الذي يجعل الطبقة التجريدية منطقية وواحدة حيث لا.

public abstract class Animal {
  public string Name {get;set;}
}

public class Dog : Animal {
  public Bark(){}
}

public class Cat : Animal {
  public Meaow(){}
}

في هذا السيناريو لدينا قاعدة مشتركة Animal الذي يوفر التنفيذ ل Name منشأه. ليس من المنطقي أن تبرز الحيوان في حد ذاته لأنه لا توجد حيوانات في العالم مجرد حيوانات ، فهي تذبل الكلاب أو القطط أو أي شيء آخر.

فيما يلي حالة من المنطقي أن يكون لديك قاعدة غير مجردة.

class Path {
  public Path(IList<Point> points) {
    this.Points = new ReadOnlyCollection<Point>(points);
  }
  public ReadOnlyCollection<Point> Points {get;}
}

class RectanglePath : Path{
  public SquarePath (Point origin, int height, int width) : 
   base(new List<Point>{origin, new Point(origin.X + width, point.Y}, ....){

  }
}

هنا المسار غير المنطقي ، يمكننا إنشاء أي شكل تعسفي ، ولكن قد يكون أكثر ملاءمة لاستخدام النظارة الفرعية لأشكال أكثر تحديدًا.

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