ما هو الأساس المنطقي وراء وجود كائنات مصاحبة في Scala؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك حالة يلزم فيها كائن مصاحب (مفرد) للفصل الدراسي؟لماذا أريد إنشاء فصل دراسي، على سبيل المثال Foo وأيضًا إنشاء كائن مصاحب له؟

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

المحلول

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

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

نصائح أخرى

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

abstract class AnimalCounter
{
    var animals = 0

    def name: String

    def count()
    {
        animals += 1
        println("%d %ss created so far".format(animals, name))
    }
}

abstract class Animal
{
    def companion: AnimalCounter
    companion.count()
}

object Dog extends AnimalCounter
{
    val name = "dog"
}

class Dog extends Animal
{
    def companion = Dog
}

object Cat extends AnimalCounter
{
    val name = "cat"
}

class Cat extends Animal
{
    def companion = Cat
}

الذي ينتج هذا الإخراج:

scala> new Dog
1 dogs created so far

scala> new Cat
1 cats created so far

scala> new Dog
2 dogs created so far

scala> new Cat
2 cats created so far

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

  1. بدون "جديد" (ليس بهذه الأهمية حقًا)

  2. مع مجموعات مختلفة محتملة من المعلمات (مقارنة بما يكتبه Bloch في Java الفعالة حول مُنشئ التلسكوب)

  3. مع القدرة على تحديد الفئة المشتقة التي تريد إنشاءها بدلاً من الفئة المجردة (المرافقة).

رمز المثال:

abstract class AbstractClass;
class RealThing(s: String) extends AbstractClass;
class AlternativeThing(i: Int) extends AbstractClass;
object AbstractClass {
  def apply(s: String) = {
    new RealThing(s)
  }
  def apply(i: Int) = {
    new AlternativeThing(i)
  }
}

// somewhere else you can
val vs = AbstractClass("asdf")  // gives you the RealThing wrapped over string
val vi = AbstractClass(123)  // gives you AlternativeThing wrapped over int

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

وبالإضافة إلى الأشياء التي قيلت صائم في <لأ href = "https://stackoverflow.com/questions/609744/what-is-the-rationale-behind-having-companion-objects-in-scala/612848# 612848 "> رده ، يبدو المجمع سكالا أيضا ل تحويلات ضمنية من أنواع الكائنات في رفيق المقابلة (من المصدر أو الهدف)، وبالتالي فإن التحويلات لا تحتاج إلى أن يتم استيراده.

وعن سبب الأشياء المفردة في في سكالا يقول:

<اقتباس فقرة>   

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

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

وعلاوة على ذلك، بل هو ميزة لغة المقدمة للكتابة نمط المفرد دون أن تفعل أي شيء. وهذا مفيد خصوصا عندما كنت في حاجة الى المفرد لتغليف مفوضا لحياة JVM. على سبيل المثال، كتابة مكتبة عميل HTTP بسيطة في سكالا حيث يمكنك تغليف وجافا التنفيذ استنادا مفوضا الأساسي وتسمح للمستهلكين من API الخاصة بك يعيش في عالم النقي.

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

لمزيد من المعلومات التفصيلية يرجى مراجعة المقال الكلمة في البرمجة سكالا

في البداية، فإنه يوفر فصل واضح من ثابت مقابل أساليب غير ثابتة methods.Also توفير وسيلة بسيطة لإنشاء فئة المفرد.

وكما يمكن أن ترث أساليب من الطبقات و / أو الصفات الأخرى، والتي لا يمكن القيام به مع جافا methods.and ثابتة يمكن أن تنتقل كمعلمة.

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