سؤال

ما الذي يجعل النوع مختلفًا عن الفصل والعكس؟

(بالمعنى العام للغة اللاأدرية)

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

المحلول

الإجابة التالية من كتاب Gof (أنماط التصميم)

كائن فصل يحدد كيفية تنفيذ الكائن. يحدد الفئة الحالة الداخلية للكائن وتنفيذ عملياته.

في المقابل، كائن يكتب يشير فقط إلى واجهته - مجموعة من الطلبات التي يمكن أن تستجيب إليها.

يمكن أن يكون للكائن العديد من الأنواع ، ويمكن أن يكون للكائنات من الفئات المختلفة نفس النوع.

//example in c++
template<typename T> 
const T & max(T const & a,T const &b)
{
return a>b?a:b;  //> operator of the type is used for comparison
}

تتطلب الدالة max نوعًا به العملية > مع نوعه الخاص كواحد من واجهاته، يمكن استخدام أي فئة تفي بالمتطلبات المذكورة أعلاه لإنشاء وظيفة الحد الأقصى المحددة لتلك الفئة.

نصائح أخرى

وأعتقد دائما من 'نوع' كما مظلة عبارة عن "الطبقات" و "البدائيون".

وint foo; // Type is int, class is nonexistent.

وMyClass foo; // Type is MyClass, class is MyClass

مستوحاة من ويكيبيديا...

في نظرية النوع شروط؛

  • أ يكتب هي واجهة مجردة.
    تمثل الأنواع بشكل عام الأسماء، مثل شخص أو مكان أو شيء أو شيء مسمى،

  • أ فصل يمثل تنفيذ النوع.
    إنها بنية بيانات ملموسة ومجموعة من الإجراءات الفرعية

    يمكن للفئات الخرسانية المختلفة إنتاج كائنات من نفس النوع المجرد (اعتمادًا على نظام الكتابة).

    *على سبيل المثال، يمكن للمرء تنفيذ يكتب Stack مع اثنين الطبقات: SmallStack (سريع للأكوام الصغيرة، ولكن المقاييس سيئة) و ScalableStack (المقاييس جيدة ولكن النفقات العامة مرتفعة بالنسبة للأكوام الصغيرة).*

    وبالمثل، قد يكون لفئة معينة عدة مختلفة بناة.

enter image description here

مثال الموز.

  • أ Banana يكتب سيمثل خصائص ووظائف الموز بشكل عام.

  • ال ABCBanana و XYZBanana الطبقات سوف تمثل طرق إنتاج الموز.
    (موردو الموز المختلفون في الحياة الواقعية، أو هياكل ووظائف بيانات مختلفة لتمثيل الموز ورسمه في لعبة فيديو).

    ال ABCBanana يمكن للفصل بعد ذلك إنتاج موز معين الحالات التابع ABCBanana فصل, ، انهم سوف يكون أشياء ل يكتب موز.

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

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

إذا كنت تريد، يمكنك أن تبحث في الامر بهذه الطريقة: هناك نوع هو مفهوم الأم. جميع المفاهيم الأخرى: من الدرجة الاولى، واجهة، هيكل، صحيح الخ ترث من هذه concept.i.e وهي أنواع

النوع يحتوي على وصف للبيانات (أيالخصائص، العمليات، الخ)،

الفئة هي نوع محدد - إنها قالب لإنشاء مثيلات لها أشياء.

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

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

مجرد التحدث فصل هو نوع متخصص تستخدم لتغليف خصائص وسلوك الكائن.

يمكن أن تعطيك ويكيبيديا إجابة أكثر اكتمالا:

لتوضيح أنه أسرع وسيلة:

والبنية هي نوع، ولكن البنية ليس فئة.

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

ونوع هو المفهوم مجموعة شاملة من الطبقة. بمعنى أوسع، فئة هي نموذج واحد من نوع.

وترتبط ارتباطا وثيقا الطبقات هي واجهات، والتي يمكن نحلة ينظر إليها على أنها نوع خاص جدا من الدرجة - واحدة مجردة بحتة. هذه هي أنواع للغاية.

وهكذا "نوع" يشمل الطبقات، واجهات وفي معظم لغات البدائيون جدا. أيضا منصات مثل CLR-دوت نت لديها أنواع هيكل أيضا.

وأفكاري هي الى حد كبير تماشيا مع إجابة جامعة الآغاخان لل.

وأرى الطبقات كقالب لبناء الأجسام، بينما أنواع هي طريقة لتصنيف تلك الكائنات، وتوفر لنا مع واجهة لهم.

وبيثون يضيف أيضا metaclasses، التي هي مجرد آلية لبناء الطبقات، وبنفس الطريقة التي الطبقات بناء الأجسام (وكذلك والطبقات وmetaclasses على حد سواء الكائنات).

هذا الرد لنفس السؤال في لامبا في نهاية المطاف يبدو لي مثل تفسير الكمال.

مأخوذ من اقتباس GoF من أدناه:

كائنات فصل يحدد كيفية تنفيذ الكائن. يحدد الفئة الحالة الداخلية للكائن وتنفيذ عملياته.

في المقابل، كائنات يكتب يشير فقط إلى واجهته -مجموعة الطلبات التي يمكن أن تستجيب إليها.

أريد تقديم مثال باستخدام Java:

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

كلا الفئتين A و B تنفيذ الواجهة وبالتالي فهي من النوع IType.بالإضافة إلى ذلك، في Java، تنتج كلا الفئتين نوعهما الخاص (بغض النظر عن اسم الفئة الخاصة بهما).وهكذا الطبقة A هو من النوع A و IType والفصل B هو من النوع B و IType مرضيه:

يمكن أن يكون للكائن العديد من الأنواع ، ويمكن أن يكون للكائنات من الفئات المختلفة نفس النوع.

ربما يساعد الفرق بين الأنواع الفرعية والفئة الفرعية على فهم هذه المشكلة أيضًا:

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

لإضافة مثال آخر من التمييز: في C ++ لديك أنواع المؤشر والمرجعية التي يمكن الرجوع إلى الطبقات، ولكنها ليست دروسا في حد ذاتها

Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"

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

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

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

ملحوظة أيضا أن قيمة الكائن يمكن أن يكون إلا فئة واحدة، ولكنه قد يكون أنواع متعددة، لأن كل الفائقة تقدم مجموعة فرعية من وظائف متوفرة في فئة الكائن.

وذلك على الرغم من الكائنات والأنواع ترتبط ارتباطا وثيقا، فهي في الحقيقة ليست نفس الشيء.

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

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

هذا التعريف صحيح في الغالب، لكن بعض اللغات حاولت الجمع بين الأنواع والفئات بطرق مختلفة، وكانت النتائج مفيدة ومتنوعة.

وترتبط أنواع وفئات كنها ليست متطابقة. بلدي يأخذ هو أن تستخدم الطبقات لتنفيذ الميراث، في حين يتم استخدام أنواع لاستبدال وقت التشغيل.

<وأ href = "http://ocw.mit.edu/NR/rdonlyres/Electrical-Engineering-and-Computer-Science/6-170Fall-2005/915D0C58-87BE-46B4-893A-42CFCA08A717/0/ lec14.pdf "يختلط =" نوفولو noreferrer "> هنا هو رابط شرح <م> مبدأ الإحلال ولماذا فرعية وفرعية ليست دائما نفس الشيء (في جاوة على سبيل المثال). و ويكيبيديا الصفحة على لاتباين وتباين مرافق وتباين معاكس لديه المزيد من المعلومات عن هذا التمييز.

والسؤال للاهتمام. أعتقد أن الجواب جامعة الآغاخان هي على الفور. تأخذ الطبقة جافا ArrayList كمثال

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

وقال مثيل من فئة ArrayList أن تكون من نوع كل المتفوقة بل يمتد وعلى كل واجهة التي تنفذها. لذلك، مثيل من فئة ArrayList لديه ArrayList نوع، RandomAccess، Cloneable، وهكذا دواليك. وبعبارة أخرى، القيم (أو الحالات) تنتمي إلى واحدة أو أكثر من أنواع، والطبقات تعرف ما هي هذه الأنواع.

قد تصف فئات مختلفة نفس النوع.

النوع يتكون من هذه الأجزاء:

  1. العمليات = بناء الجملة
  2. وصف العمليات = الدلالات

يتكون الصف من هذه الأجزاء:

  1. العمليات = بناء الجملة
  2. التنفيذ (= تطبيقات مختلفة تصف نفس الدلالات)

بعض الملاحظات:

  • الواجهة (كما في Java) ليست من النوع، لأنها لا تصف الدلالات (تصف بناء الجملة فقط)

  • الفئة الفرعية ليست نوعًا فرعيًا، لأن الفئة الفرعية قد تغير الدلالات المحددة في الفئة الفائقة، ولا يمكن للنوع الفرعي تغيير دلالات النوع الفائق (انظر مبدأ استبدال ليسكوف، على سبيل المثال. مثال LSP هذا).

من الواضح، كما أن هناك لغات مع نظام النوع الذي لا OO لغات البرمجة، <م> نوع يجب أن يكون مفهوما أوسع من الدرجة

وحتى في لغات مثل جافا، int هو (البدائي) نوع، ولكن ليس فئة.

وبالتالي: كل فئة هي نوع، ولكن ليس كل نوع هي فئة

.

إذا فكرنا في هذا السؤال في سياق C#، فسنصل إلى الإجابة أدناه.

ينقسم نظام نوع C# إلى الفئات التالية:

أنواع القيمة:

  • أنواع بسيطة:مثل int وlong وfloat وما إلى ذلك.
  • أنواع التعداد
  • أنواع الهياكل
  • أنواع لاغية

أنواع المراجع:

  • أنواع الفصول
  • أنواع الواجهة
  • أنواع المصفوفات
  • أنواع المندوبين

كما ترون هناك العديد من الأنواع في C# والتي Class هي واحدة منها فقط.هناك ملاحظة مهمة واحدة فقط:تم توحيد نظام الكتابة في C# بحيث يمكن التعامل مع أي قيمة من أي نوع ككائن.كل نوع في C# مشتق بشكل مباشر أو غير مباشر من نوع فئة الكائن، والكائن هو الفئة الأساسية النهائية لجميع الأنواع.يتم التعامل مع قيم الأنواع المرجعية ككائنات ببساطة عن طريق عرض القيم ككائن كتابة.يتم التعامل مع قيم أنواع القيم ككائنات عن طريق إجراء عمليات الملاكمة وإلغاء التغليف.

لذا، كما أرى، فإن الكتابة هي مظلة تغطي العديد من العناصر والصنف هو واحد منها.

المرجع:وثيقة مواصفات لغة CSahrp، الصفحة 4

في لغة عامة ملحدة حاسة - فصل هو ادراك التابع يكتب.

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

على العكس من ذلك، على سبيل المثال، في سياق C# - فصل انه ببساطة واحد التابع اكثر كثير التطبيقات من أ يكتب مفهوم مثل البدائيات والهياكل والمؤشرات وما إلى ذلك.

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

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

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

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

فصول فقط تعطيك المرونة اللازمة لتحديد أنواع جديدة وكل شيء عن الكيفية التي تعمل بها.

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

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