سؤال

ما هو نوع العودة Covariant في جافا؟ في البرمجة الموجهة للكائنات بشكل عام؟

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

المحلول

عودة Covariant، تعني أنه عندما يتجاوز المرء طريقة، يسمح بنوع الإرجاع للطريقة الغالبية أن يكون نوع فرعي لنوع إرجاع طريقة Overidden.

لتوضيح هذا بمثال، حالة مشتركة Object.clone() - الذي أعلن أن يعيد نوعا من Object. وبعد يمكنك تجاوز هذا في الفصل الخاص بك كما يلي:

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}

الفائدة هنا هي أن أي طريقة تحمل إشارة صريحة إلى كائن MyFoo ستتمكن من الاحتجاج clone() ومعرفة (بدون صب) أن قيمة الإرجاع هي مثيل MyFoo. وبعد بدون أنواع عودة Covariant، يجب أن يتم الإعلان عن طريقة تجاوز التشغيل في MyFOO للعودة Object - وبالتالي يجب أن يتصل رمز الاتصال بوضوح بشكل صريح نتيجة مكالمة الأسلوب (حتى يعتقد أن كلا الجانبين "يعرفون" أنه لا يمكن إلا أن تكون مجرد مثيل من MYFOO).

لاحظ أنه لا يوجد شيء خاص عنه clone() وأن أي طريقة تجاوز يمكن أن يكون لها عودة covarian - لقد استخدمتها كمثال هنا لأنها طريقة قياسية حيث يكون هذا مفيدا في كثير من الأحيان.

نصائح أخرى

إليك مثال بسيط آخر:

Animal صف دراسي

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog صف دراسي

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

من الممكن تعديل نوع العودة من DogseekFood() طريقة ل DogFood - فرعية من Food, ، كما هو مبين أدناه:

@Override
protected DogFood seekFood() {

    return new DogFood();
}

هذا تماما غرامة قانونية، ونوع العودة DogseekFood() الطريقة المعروفة باسم إرجاع covariant.

من إصدار JDK 1.5، تم تقديم أنواع Covariant في Java. وسوف أشرح لك مع حالة بسيطة: عندما نتجاوز وظيفة السماح للدالة بإجراء تغييرات على سلوكها هذا ما تحصل عليه من القراءة في معظم الكتب، ولكن ما يفوته المؤلفون} هو أنه يمكننا تغيير نوع الإرجاع أيضا. تحقق أدناه رابط للتوضيح يمكننا تغيير نوع الإرجاع طالما يمكن تعيينه لإرجاع نوع الإصدار الأساسي من الطريقة.

لذلك هذه الميزة من الأنواع المستمدة من العودة يسمى Covarian ...

هل يمكن أن تختلف طرق تجاوزها في نوع المرتج؟

أنواع عودة covariant تعني ببساطة إرجاع مرجع الطبقة الخاصة أو مرجع فئة الطفل.

class Parent {
 //it contain data member and data method
}

class Child extends Parent { 
//it contain data member and data method
 //covariant return
  public Parent methodName() {
     return new Parent();
          or 
     return Child();
  }

}

يحدد نوع إرجاع Covariant أن نوع الإرجاع قد يختلف في نفس الاتجاه مثل الفئة الفرعية

class One{  
    One get(){return this;}  
}  

class Two extends One{  
  Two get(){return this;}  

void message(){
  System.out.println("After Java5 welcome to covariant return type");
}  

public static void main(String args[]){  
    new Two().get().message();  
}  
}

قبل Java 5، لم يكن ذلك ممكنا تجاوز أي طريقة عن طريق تغيير نوع الإرجاع. ولكن الآن، منذ JAVA5،

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

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

  • مساعدة في منع وقت التشغيل ClasscastEctions في العائدات

المرجع: www.geeksforgeeks.org.

  • يتيح نوع إرجاع Covariant في Java، تضييق نوع الإرجاع من طريقة Overdedden.
  • ستساعد هذه الميزة في تجنب الصب على جانب العميل. يسمح برمجيات البرنامج دون الحاجة إلى فحص الكتابة وأسفل الصب.
  • يعمل نوع إرجاع Covariant دائما فقط لأنواع الإرجاع غير البدائية.
interface Interviewer {
    default Object submitInterviewStatus() {
        System.out.println("Interviewer:Accept");
        return "Interviewer:Accept";
    }
}
class Manager implements Interviewer {
    @Override
    public String submitInterviewStatus() {
        System.out.println("Manager:Accept");
        return "Manager:Accept";
    }
}
class Project {
    public static void main(String args[]) {
        Interviewer interviewer = new Manager();
        interviewer.submitInterviewStatus();
        Manager mgr = new Manager();
        mgr.submitInterviewStatus();
    }
}

مثال آخر هو من جافا،

unaryoperator.java.

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {

    /**
     * Returns a unary operator that always returns its input argument.
     *
     * @param <T> the type of the input and output of the operator
     * @return a unary operator that always returns its input argument
     */
    static <T> UnaryOperator<T> identity() {
        return t -> t;
    }
}

وظيفة java.

@FunctionalInterface
public interface Function<T, R> {

    ........
    ........
    ........
    ........

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

قبل Java5، لم يكن من الممكن تجاوز أي طريقة عن طريق تغيير نوع الإرجاع. ولكن الآن، منذ Java5، من الممكن تجاوز الأسلوب عن طريق تغيير نوع الإرجاع إذا تجاوز الفرعية أي طريقة لنوع الإرجاع غير بدائي ولكنه يغير نوع مرتجته إلى نوع الفئة الفرعية.

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