سؤال

هناك غير قابل للتغيير فصل:

Scope<Cmp extends Comparable<Cmp>>
public Scope<Cmp> crop(Scope<Cmp> scope) {
    ...
    return new Scope<Cmp>(starts, ends);
}

لديها كثير يتم توسيع طرق مماثلة من خلال:

Timerange extends Scope<Date>

و كثير الآخرين (أيضا غير قابل للتغيير).

أرغب في إرجاع كائن من نوعه.على سبيل المثال:

timerange.crop(scope)

يجب أن يُرجع كائن النطاق الزمني، وليس النطاق.

هل يجب علي تجاوز كل طريقة (أو استخدام الانعكاس)؟هل هناك طريقة أخرى للقيام بذلك؟

شكرا مقدما ، etam.

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

المحلول

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

public abstract class Scope<E extends Comparable<E>> {
    abstract Scope<E> create(E start, E end);

    public Scope<E> crop(Scope<E> scope) {
        ...
        return create(starts, ends);
    }
}
public TimeRange extends Scope<Date> {
    Scope<Date> create(Date start, Date end) {
        return new TimeRange (...);
    }
}

قد ترغب في إضافة معلمة "هذا" عامة إلى الفئة الأساسية:

public abstract class Scope<THIS extends Scope<THIS, E>, E extend Comparable<E>> {
    abstract THIS create(E start, E end);

    public THIS crop(Scope<E> scope) {
        ...
        return create(starts, ends);
    }
}
public TimeRange extends Scope<TimeRange,Date> {
    TimeRange create(Date start, Date end) {
        return new TimeRange (...);
    }
}

وهذا يضيف عملاً إضافيًا إلى رمز العميل.

نصائح أخرى

يمكنك تجربة ما يلي:

class Scope<Cpm extends Comparable<Cpm>, Derived extends Scope<Cpm, Derived>> {
  public Derived crop(Scope<Cmp, Derived> scope)
}

سيتم تعريف TimeRange على أنه

class TimeRange extends Scope<Date, Timerange>

و حينئذ crop سيعود كائن TimeRange.عندما تكون الفئة المشتقة غير محددة، يمكنك استخدام أحرف البدل العامة (Scope<Date, ?>)

لا تحتوي Java على إرجاعات من النوع الذاتي، لذلك تحتاج عمومًا إلى تجاوز كل طريقة يدويًا.يرى مدونتي عن "أنواع الذات" للمناقشة مع بعض البدائل الممكنة.

هل تحتاج حقا Timerange؟هل تقدم أي شيء أكثر من مجرد Scope<Date>؟إذا لم يكن الأمر كذلك، ثم استخدم فقط Scope<Date>.

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

Scope<Cmp extends Comparable<Cmp>> implements Cloneable
public Scope<Cmp> crop(Scope<Cmp> scope) {
    ...
    Scope<Cmp> result = (Scope<Cmp>)super.clone();
    result.init(starts, ends); // sets the fields for a cloned object
                               // init() could be private
    return result;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top