سؤال

لدي اثنين من تطبيقات وحدة التحكم, استعلام التحديث ، التي تشترك في بعض الوظائف.أردت أن يكون فئتين ترث من قاعدة مشتركة الدرجة ، ولكن المشكلة هي أن وحدة التحكم التطبيق ، يجب أن يكون static Main وظيفة.ما لدي حاليا هي التالية:

namespace Utils
{
    public class ConsoleBase
    {
        protected const int ERROR_EXIT_CODE = 1;
        protected static void printWarning(string msg) {...}
        public ConsoleBase(IEnumerable<string> args) { ... }
...

namespace Update
{
    class Update : ConsoleBase
    {
        private static ConsoleBase _consoleBase;
        public static void Main(string[] args) { ... }
...

namespace Query
{
    class Query : ConsoleBase
    {
        private static ConsoleBase _consoleBase;
        public static void Main(string[] args) { ... }
...

يبدو أن مشكلة تصميم لي أن كل من يرث من ConsoleBase وكذلك لها مثيل من static متغير داخل كل فئة مشتقة.السبب في أنني أفعل هذا:

  1. أنا يمكن أن يكون protected static أساليب محددة في ConsoleBase التي يمكن الوصول إليها أخرى static أساليب في الفئات المشتقة.
  2. أنا يمكن أن تمر على وسيطات سطر الأوامر إلى منشئ ConsoleBase, هل المشتركة الاشياء ، ومن ثم الوصول إلى الحجج مرة أخرى في الفئات المشتقة عن طريق public الخصائص و الأساليب على سبيل المثال من ConsoleBase.

وذلك في الفئات المشتقة لدي خليط من يدعو إلى أساليب/خصائص على سبيل المثال من ConsoleBase, مثلا

_consoleBase.UseDebugMode()

فضلا عن استدعاء الموروث أساليب ثابتة و الوصول إلى ورثت الثوابت التي تم تعريفها في ConsoleBase, مثلا

printWarning(CONST_MSG_IN_BASE_CLASS);

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

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

المحلول

لا تخلط ثابت و أساليب المثال مثل هذا.

النظر في فصل المسؤولية أن أساليب ثابتة تقدم إلى فئة مختلفة التي يمكن أن ترث من.جعل غير ثابت وظيفة فئة منفصلة أنك الإجمالي مثيل في تحديث الاستعلام.

بالإضافة إلى, إذا كان التحديث و الاستعلام مشتقات من ConsoleBase - لماذا تحتاج إجمالي الحالات ؟

نصائح أخرى

نعم يمكنك تحديد الفئة الأساسية مع محمية ثابت الرئيسية ، ثم استدعاء BaseClass.الرئيسية(وسائط) من الأسلوب الرئيسي في وراثة الطبقات.

هذا سينتكس هو الأصح:

public class BaseApp
{
    public static Main(String[] args)
    {
        // TODO: ...
    }
}

public class App1 : BaseApp // Same for App2
{
    // There is no need to keep a reference of the base class
    // if you are accessing static methods only

    public static Main(String[] args)
    {
        BaseApp.Main(args); // Access via class, not via instance
    }
}

أنا لا أعتقد أنك بحاجة إلى أن تفعل ذلك.لماذا لا ببساطة الاتصال ConsoleBase.الرئيسي() وظيفة الخاص بك مع سطر الأوامر الحجج ؟

وجود مثيل من الفئة الأساسية هي مشكلة التصميم.

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