Bu soruna tipik yolu InheritedType
ve InheritedType2
için ortak üst sınıf tanıtmaktır. Bunun nedeni, açıkça, bu iki türün mantığı paylaşmasıdır: temel olarak hem sol hem de sağ işlenenler üzerinde çalışırlar.
abstract class LeftRightType extends Type {
private Type left, right;
public LeftRightType(Type left, Type right) {
this.left = left;
this.right = right;
}
@Override
public Type simplify() {
return newInstance(left.simplify(), right.simplify()).simplify();
}
public abstract Type newInstance(Type left, Type right);
}
Bu, o anda çoğaltma olan mantığı tutan ve uygulayıcılarının geçersiz kılar bir newInstance
soyut yöntem haline somut örneğinin oluşturulmasını temsilci: Yani bize LeftRightType
(daha iyi bir isim olmadığı için) oluşturalım. Sonra sadece Java'yı 8 kullanıyorsanız, somut sınıfı vererek çok yapıcı doğrudan dönmek olduğunu yoğunlaşabilir ki
class InheritedType extends LeftRightType {
public InheritedType(Type left, Type right) {
super(left, right);
}
@Override
public Type newInstance(Type left, Type right) {
return new InheritedType(left, right);
}
}
class InheritedType2 extends LeftRightType {
public InheritedType2(Type left, Type right) {
super(left, right);
}
@Override
public Type newInstance(Type left, Type right) {
return new InheritedType2(left, right);
}
}
Not olabilir. Artık soyut bir yönteme bile gerek yok.
abstract class LeftRightType extends Type {
private Type left, right;
private BinaryOperator<Type> typeSupplier;
public LeftRightType(Type left, Type right, BinaryOperator<Type> typeSupplier) {
this.left = left;
this.right = right;
this.typeSupplier = typeSupplier;
}
public Type simplify() {
return typeSupplier.apply(left.simplify(), right.simplify()).simplify();
}
}
ve sonra
class InheritedType extends LeftRightType {
public InheritedType(Type left, Type right) {
super(left, right, InheritedType::new);
}
}
class InheritedType2 extends LeftRightType {
public InheritedType2(Type left, Type right) {
super(left, right, InheritedType2::new);
}
}
Kodunuz gerçekten mantıklı değil var. 'Sadeleştirme' için yapılan her çağrı, 'sadeleştirmek' için bir özyinelemeli çağrıyla sona erer. Yöntemleriniz, bildirilmemiş alanlara başvuruda bulunur, dolayısıyla bildirilmelerini istediğiniz yerleri netleştirmezsiniz. Yararlı tavsiyeler almak için en az * doğru * örnek göndermelisiniz. – ruakh