مرجع
آخر الزيارات

علاقة Is-a

878 كلمة•0 مشاهدة•🗒️ منذ يوم
باختصار: في تمثيل المعرفة، البرمجة والتصميم الكينوني (انظر بنية البرنامج الكينوني)، ((is_a or is a)) هي علاقة من العلاقات الفرعية خاصية التجريد كما في (الكلاسات، الفئات)، حيث يكون كلاس A هو فئة فرعية من كلاس B أخرى (وبالتالي فإن B هي فئة فائقة من…. في هذه المقالة 21 قسماً: «}»، «{» و«}» وغيرها.
المحتويات
  1. }
  2. {
  3. }
  4. };
  5. PayloadList
  6. };
  7. DrawSquare(static_cast(s));
  8. {
  9. pass
  10. void setPayload(int index, P val);
  11. b = B
  12. }
  13. some_a.do_something_a_like
  14. pass
  15. double GetWidth const { return itsWidth; }
  16. {
  17. };
  18. B b;
  19. }
  20. }
  21. class B : public A

بدايةً، في تمثيل المعرفة، البرمجة والتصميم الكينوني (انظر بنية البرنامج الكينوني)، ((is_a or is a)) هي علاقة من العلاقات الفرعية خاصية التجريد كما في (الكلاسات، الفئات)، حيث يكون كلاس A هو فئة فرعية من كلاس B أخرى (وبالتالي فإن B هي فئة فائقة من A). بمعنى آخر، النوع A هو نوع فرعي من النوع B عندما تتضمن مواصفات A مواصفات B. أي أن أي كائن (أو فئة) يفي بمواصفات A يفي كذلك بمواصفات B  في نفس الوقت، لأن مواصفات B أضعف. وتعرض الأقسام التالية جوانب أخرى من الموضوع.

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

وholonym (كامل) meronym لها (جزء)،

علاوةً على ذلك، المرادف (المكون) له جزء من العلاقة مع الاسم المستعار (الكيان)،

من جهة ثانية، بالنسبة لعلاقة الاستيعاب: الاختصار (النوع الفرعي، الفئة الفرعية) له علاقة من نوع (is-a) ويكون الاختصار (supertype ، superclass)؛

وعلى صعيد آخر، holonym - العلاقات المرادفة وتأتي بالتسلسل الهرمي التالي (كامل / الكيان / جزء الحاوية / المكون / العضو) بين الأنواع (الفئات) التي تحدد التسلسل الهرمي التملك، حيث تكون

لتلخيص العلاقات لدينا:

إضافةً إلى ذلك، يجب أن تكون العلاقة is-a متناقضة في مع علاقة (has_a or has a) بين أنواع (الكلاسات)؛ إن الخلط بين العلاقات هو has-a و is-a هو خطأ شائع عند تصميم نموذج (مثلًا، برنامج كمبيوتر) للعلاقة الواقعية بين كائن ما ومرؤوسه. ويمكن لهذه العلاقة ان تتعارض مع مثيلاتها من العلاقات الباقية والتي يمكن أن تكون بين الكائنات (حالات) وأنواع (الكلاسات): انظر «من نوع رمزي التمييز» و «علاقات من نوع رمزي».

مرادف (عضو) له علاقة عضو مع اسمه المختصر (الحاوية)؛

لعلاقة تجميع في التسلسل الهرمي وهي:

الرمز المميز (كائن) له علاقة مثيل بنوعه (الفئة).

من جهة ثانية، ينشئ كود C ++ التالي علاقة وراثية صريحة بين الفئتين B و A ، حيث B هي فئة فرعية ونوع فرعي اخر من A ، ويمكن استخدامها ك A حيثما يتم تحديد B (عبر مرجع أو مؤشر أو الكائن نفسه)). class A

لعلاقة تكوين (أي بالملكية):

لعلاقة احتواء:

من جانب آخر، العلاقات بين المفهوم والكائن (النوع المميز) بين الأنواع (الفئات) والكائنات (الحالات)، حيث

  • { public:
  • void DoSomethingALike const {}
  • };

من جهة ثانية، Hyperonym - الاختصار (supertype – subtype) العلاقات بين الكلاسات التي تحدد التسلسل الهرمي للتصنيف، حيث

}

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

فيما يلي مثال أكثر دقة على انتهاك LSP: class Rectangle

{

  • public:
  • virtual void SetWidth(double w);
  • virtual void SetHeight(double h);

}

وفي السياق ذاته، المعلمات التالية من PayloadList هي أنواع فرعية من القائمة <سلسلة>: PayloadList

PayloadList

};

علاوةً على ذلك، يعمل هذا بشكل جيد ولكن عندما يتعلق الأمر بالفئة المربعة، التي ترث فئة المستطيل، فإنها تنتهك LSP على الرغم من أن العلاقة هي علاقة بين المستطيل والمربع. لأن المربع مستطيل. يتجاوز المثال التالي وظيفتين، Setwidth و SetHeight ، لإصلاح المشكلة. لكن إصلاح الرمز يعني أن التصميم معيب. public class Square : Rectangle

PayloadList

ومن جهة أخرى، يشرح مبدأ استبدال Liskov خاصية، «إذا كان لكل كائن o1 من النوع S يوجد كائن o2 من النوع T بحيث لا يتغير سلوك P لجميع البرامج P المحددة من حيث T ، عندما يتم استبدال o1 بـ o2 ثم S هو نوع فرعي من T». يوضح المثال التالي انتهاك LSP. void DrawShape(const Shape& s)

};

  • void Square::SetWidth(double w)
  • {
  • Rectangle::SetWidth(w);
  • Rectangle::SetHeight(w);

DrawSquare(static_cast(s));

DrawCircle(static_cast(s));

else if (typeid(s) == typeid(Circle))

{

if (typeid(s) == typeid(Square))

pass

def use_an_a(some_a):

void setPayload(int index, P val);

...

b = B

وفي السياق ذاته، المثال التالي، النوع (أ) هو نوع «عادي»، والنوع (النوع (أ)) هو نوع من بيانات. على الرغم من توزيع جميع الأنواع على نفس نوع البيانات الوصفية (PyType_Type ، وهو كذلك نوعها الخاص)، إلا أن هذا ليس شيء متطلب. نوع الفصول الكلاسيكية، والمعروف باسم الأنواع. ClassType ، يمكن كذلك اعتباره نوعًا متميزًا. >>> a = 0

use_an_a(b) # b can be substituted for an A.

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

كذلك، باستخدام فئات المجموعات، المصفوفة ، ترث القائمة ووبالتالي توسع المجموعة . لذا فإن المصفوفة من نوع string هو نوع فرعي من القائمة ، وهو نوع فرعي من المجموعة . يتم الحفاظ على علاقة الأنواع الفرعية والأنواع تلقائيًا. عندما نحدد واجهة، PayloadList ، تربط قيمة اختيارية من النوع العام P بكل عنصر، قد يبدو إعلانه كما يلي: interface PayloadList extends List {

  • >>> type(a)
  • >>> type(type(a))
  • >>> type(type(type(a)))
  • >>> type(type(type(type(a))))

}

ومن جهة أخرى، ينشئ رمز بايثون التالي علاقة وراثية صريحة بين الفئتين B و A ، حيث يكون B فئة فرعية ونوعًا فرعيًا من A ، ويمكن استخدامه ك A حيثما كان مطلوبًا B. class A:

def do_something_a_like(self):

some_a.do_something_a_like

def some_func:

pass

def do_something_b_like(self):

class B(A):

double GetWidth const { return itsWidth; }

  • private:
  • double itsWidth;
  • double itsHeight;

{

  • public:
  • void SetWidth(double w) { itsWidth = w; }
  • void SetHeight(double h) { itsHeight = h; }
  • double GetHeight const { return itsHeight; }

};

  • void UseAnA(A const& some_A)
  • {
  • some_A.DoSomethingALike;
  • }
  • void SomeFunc
  • {

B b;

UseAnA(b); // b can be substituted for an A.

}

  • {
  • r.SetWidth(5);
  • r.SetHeight(4);
  • assert(r.GetWidth * r.GetHeight) == 20);
  • }

كذلك، المثال التالي، الوظيفة g تعمل فقط لفئة المستطيل ولكن ليس لـ Square ، وبالتالي تم انتهاك مبدأ الإغلاق المفتوح. void g(Rectangle& r)

}

  • void Square::SetHeight(double h)
  • {
  • Rectangle::SetHeight(h);
  • Rectangle::SetWidth(h);

class B : public A

{ public:

void DoSomethingBLike const {}

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

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