ما هي الكائنات من الدرجة الأولى في Java و C#؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

عندما بدأت برمجة OO منذ عدة سنوات ، اكتسبت الانطباع بأن المتغيرات (إذا كانت هذه هي الكلمة الصحيحة) كانت إما "بدائية" (int ، مزدوجة ، إلخ) أو كائنات من الدرجة الأولى (سلسلة ، JPane ، إلخ). يتم تعزيز ذلك من خلال إجابة حديثة عن البدائية في Java و C# (Daniel Pryden: هل الأنواع البدائية مختلفة في Java و C#؟). ومع ذلك ، لا تعرف ما إذا كانت c# valuetypes هي بدائية أو كائنات أو بعض الوحش الآخر مثل الكائنات من الدرجة الثانية. أرى أن هناك استخدامًا واحدًا فقط من first-class علامة لذلك ربما لم يعد مصطلح مفيد.

لم أجد مقال ويكيبيديا مفيد ("هذه المقالة في حاجة إلى الاهتمام من خبير في هذا الموضوع."). سأكون ممتنًا للتصنيف والاستخدام الحالي للمصطلحات ، مرتبطًا بشكل أساسي بـ Java و C# (على الرغم من أن اللغات الأخرى قد تتخلص من التنوير).

توضيح: أود أن أفهم المصطلح الصف الأول وما هو نطاق استخدامه.

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

المحلول

المشكلة هي أن "كائن الدرجة الأولى" ليس مفهومًا محددًا جيدًا.

الاستخدام الطبيعي هو أن شخصًا ما يقول أن "كائن" هو فئة من الأشياء ينبغي اجعل جميع الخصائص X و Y و Z. ولكن هناك أشياء أخرى لا تحتوي على كل هذه الخصائص ، لكنها نوع من الكائنات. لذلك سوف نسمي كائنات "الدرجة الأولى" السابقة والباقي وليس "الدرجة الأولى" ... وقد لا يكون كائنات.

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

ستكون الأفكار الوحيدة القوية حقًا حول "الدرجة الأولى" هي تلك التي يمكنك من خلالها جمعها من مواصفات اللغة المعنية لـ Java و C#. وهي تنطبق حقًا فقط في نطاق أنظمة اللغات / النوع المعنية ... وليس عبر لغات متعددة.

لذا ، قد يكون "كائن Java الأول" أو "كائن الفئة الأولى C#" ذات معنى ، ولكن "كائن الفئة الأولى" غير المأخوذ من السياق ليس كذلك.

حسنًا ، هذا رأيي ...

نصائح أخرى

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

  • قد تسميتها من قبل المتغيرات.
  • قد يتم تمريرها كحجيلات للإجراءات.
  • قد يتم إرجاعها كنتائج الإجراءات.
  • قد يتم تضمينها في هياكل البيانات.

في الأساس ، هذا يعني أنه يمكنك القيام بذلك بعنصر لغة البرمجة هذا كل ما يمكنك القيام به مع جميع العناصر الأخرى في لغة البرمجة.

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

عندما تكتب int في C#، على سبيل المثال ، هو مجرد اختصار لغة ل Int32 بنية. يمكنك القيام بذلك على سبيل المثال int i=int.Parse("34"), ، او حتى string s=1234.ToString(). من أجل تعيين مثيلات بنية للمتغيرات من النوع Object, ، هناك آلية الملاكمة/إلغاء التفاح.

في Java ، من ناحية أخرى ، لديك بالفعل الأنواع البدائية مقابل فئات dicotomy. على سبيل المثال لأداء العمليات على متغير من النوع int, ، يجب عليك استخدام المساعد Integer صف دراسي. هذا واحد من الأشياء التي لا أحبها في Java مقارنة بـ .NET.

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

لكل نوع بيانات بدائية في Java ، توفر مكتبة الفئة الأساسية فئة Wrapper التي تمثلها ككائن Java. على سبيل المثال ، تلتف فئة int32 نوع بيانات int ، والفئة المزدوجة تلتف نوع البيانات المزدوجة.

من ناحية أخرى ، فإن جميع أنواع البيانات البدائية في C# هي كائنات في مساحة اسم النظام. لكل نوع بيانات ، يتم توفير اسم قصير أو الاسم المستعار. على سبيل المثال ، INT هو الاسم القصير للنظام. int32 و Double هو الشكل القصير للنظام.

يتم توفير قائمة أنواع البيانات C# ومستعارها في الجدول التالي. كما ترون ، تتوافق الثمانية الأولى من هذه الأنواع البدائية المتوفرة في Java. لاحظ ، مع ذلك ، أن منطقية Java تسمى Bool في C#.

من عند : http://msdn.microsoft.com/en-us/library/ms228360٪28vs.80،lightweight٪29.aspx

http://onjava.com/onjava/2003/05/21/delegates.html

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

مثال آخر على كائنات الفئة الأولى التي يمكنك العثور عليها غير شائعة بلغات أخرى ولكن C# تعبيرات

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

تركت أحد مؤلفي لوا لشرح ما هو عليه: البرمجة في لوا: 6 - المزيد عن الوظائف

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

بطريقة ما ، ينطبق هذا التعريف على الكائنات في Java: يمكنك تخزينها في المتغيرات ، في المصفوفات ، استخدامها كمعلمات وظيفية وإعادتها ، واستخدامها كمفتاح HashMap والمجموعات الأخرى ، إلخ.
لست متأكدًا مما إذا كان هذا هو كيفية استخدام المصطلح للكائنات ، ولكن على الأقل من المنطقي ... :-)

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

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

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

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

اللغات الوظيفية لها مفهوم "الوظيفة" وبالطبع فهي مواطن من الدرجة الأولى في أي لغة وظيفية. أود أن أقول أنه يمكننا استدعاء اللغة لغة وظيفية إذا كانت "وظيفة" كمفهوم من الدرجة الأولى (الاسم ، المرور ، العودة ، دمج ...).

لذلك ، إذا كانت بعض اللغة تجلب بعض المفاهيم ، فيمكننا "قياس" قوة هذه المفاهيم في اللغة التي لها.

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

في Java 'String' هو كائن من الدرجة الأولى. إنه مفهوم Java وهو ليس مفهومًا متاحًا لجميع لغات البرمجة.

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