سؤال

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

ولأن الأجهزة هي مشابهة جدا خططت لفئة أصل (TParent) الذي يحتوي على بعض الأساليب التجريدية (لحيث يختلف الأجهزة) ثم فئتين الطفل (TChildA، TChildB) التي تنفذ تلك الأساليب بطريقة تعتمد على الأجهزة .

ولذا أود أن مثيل أول كائن من TParent تحقق أي نوع هو ثم يطرح للطفل الصحيح.

ولكن عندما أفعل هذا، وندعو إحدى الطرق مجردة تنفيذا كاملا في فئة الأطفال أحصل على EAbstractError.

ومنها مثلا:

myHardware:=TParent.Create();

if myHardware.TypeA then
   myHardware:=TChildA(myHardware)
else
   myHardware:=TChildB(myHardware);

myHardware.SomeMehtod();

وأفترض أنني لا يمكن أن يلقي فئة الرئيسي لفئة الأطفال، وأيضا أن هناك على الارجح أفضل طريقة للقيام بذلك. أي مؤشرات؟

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

المحلول

وأنت على حق، لا يمكن ولا ينبغي أن يلقي من الفئة الأساسية لفئة مشتقة.

وأفترض أنك لا تريد أن يكون الكائن الطفل اعادة تشغيل منشئ الرئيسي؟

وإذا كان الأمر كذلك. . .

وإزالة علاقة الوالد / الطفل كما هو عليه، سيكون لديك واحد فقط من الدرجة الأجهزة. لوظائف ChildA وChildB محددة، خلق نمط جديد الميراث، بحيث يكون لديك واجهة ISpecificHardwareTasks أو الفئة الأساسية، واثنين من الفئات المشتقة (SpecificA وSpecificB).

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

والأجهزة يفضح الأساليب التي التفاف الطرق ISpecificHardWareTasks (يمكن حتى تنفيذ تلك الواجهة إذا كان هذا الأمر يبدو معقولا تماما).

وفئات محددة يمكن أن تتخذ إشارة إلى فئة الأجهزة، إذا كان هذا ضروريا (على الرغم من أنني لا أعرف إذا كان لديك الوصول إلى هذا المؤشر في منشئ يا دلفي هو الحصول على صدئ)

ونأمل أن تكون هذه التشتت ساعدت إلى حد ما.

نصائح أخرى

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

function CreateHardware(isTypeA: Boolean): TParent;
begin
  if IsTypeA then Result := TChildA.Create
  else Result := TChildB.Create;
end;
...

var
  myHardware: TParent;
begin
  myHardware := CreateHardware(True);
  myHardwarde.SomeMethod;
end;

... أو هل يمكن استخدام الدولة نمط .

والمشتركة في أي نهج غير تلك الفئة TParent الخاص بك لا يملك المعرفة لتحديد نوع knowlegde hardware.That ونقلها إلى الأسلوب المصنع، والمتصل من طريقة المصنع، المصنع نفسه أو دولة طبقية.

وبفضل ثنائي Worrier وMghie لافتا لي في الاتجاه الصحيح في هذه الحالة. فإن الإجابة التي قدمها يفن يكون أسهل طريقة في الحالات التي يكون فيها التقليل من تهيئة الجهاز ليست مسألة.

وناقش لغة pImpl في مكان آخر على SO

وهنا هو كيف أفهم التنفيذ في شبه دلفي رمز (لاحظ أنا لم ازعجت مع الفروق العامة / الخاصة لهذا):

class TParent 
  procedure SomeMethod(); abstract;
end;

class TChildA (TParent)
  procedure SomeMethod(); override;
end;

class TChildB (TParent)
  procedure SomeMethod(); override;
end;

class THardware
 HardwareSpecficMethods: TParent;
 procedure SomeMethod;
 constructor Create();

contrsuctor THardware.Create();
begin
 InitializeHardware();
 If Hardware.TypeA then
  HardwareSpecificMethods:=TChildA.Create()
 else
  HardwareSpecificMethods:=TChildB.Create();
end;

procedure THardware.SomeMethod();
begin
  HardwareSpecificMethods.SomeMethod();
end;
end; {class THardware}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top