هل يمكنني إنشاء كائن من فئة مشتقة عن طريق إنشاء الكائن الأساسي مع معلمة؟

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

سؤال

بمعنى آخر، بالنظر إلى فئة أساسية shape وفئة مشتقة rectangle:

class shape
{
public:
  enum shapeType {LINE, RECTANGLE};
  shape(shapeType type);
  shape(const shape &shp);
}

class rectangle : public shape
{
public:
  rectangle();
  rectangle(const rectangle &rec);
}

أود أن أعرف ما إذا كان بإمكاني إنشاء مثيل rectangle بالاتصال:

shape *pRectangle = new shape(RECTANGLE);

وكيف يمكنني تطبيق منشئ النسخ، من أجل الحصول على جديد rectangle بالاتصال:

shape *pNewRectangle = new shape(pRectangle);
هل كانت مفيدة؟

المحلول

إجابة قصيرة: لا

اجابة طويلة:

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

class Shape
{
    static Shape* createShape(shapeType type)
    {
        switch (type)
        {
             case RECTANGLE:return new rectangle();
           ...
        }
    }
 }; 

تفضيل شخصي:

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

لذلك أود أن فصل المصنع إلى فئة غير صحيحة.

نصائح أخرى

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

المشكلة هي، عند القيام شكل جديد (...)، ستقوم دائما بإرجاع مثيل الشكل - وليس المستطيل. إذا كنت تريد "مستطيل"، في مرحلة ما، ستحتاج إلى الاتصال بالمستطيل الجديد (..). طريقة يمكن أن تتعامل مع هذا المنطق بالنسبة لك، ولكن ليس البناء الافتراضي في C ++.

سيقدم لك الدعوة منشئ دائما كائن من نوع المنشئ.

new shape(...)

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

shape *pRectangle = new shape(RECTANGLE);

لا توجد وسيلة لك لإنشاء فئة مشتقة عن طريق إنشاء كائن أساسي. عليك أن تفعل جديدة من الفئة المشتقة نفسها.

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

انظر على سبيل المثال http://www.cprogramming.com/Reference/typecasting/dynamiccast.html.

يمكنك القيام بشيء من هذا القبيل مع التصميم القائم على السياسات. سيكون الكود الخاص بك شيء مثل

shape* pRectangle = new derrivedType<rectangle>();

التصميم القائم على السياسات

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