هل يمكنني إنشاء كائن من فئة مشتقة عن طريق إنشاء الكائن الأساسي مع معلمة؟
-
12-09-2019 - |
سؤال
بمعنى آخر، بالنظر إلى فئة أساسية 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>();