görünümünde bir tipleme açısından en iyi yol çocukta iç içe sınıfları belirtmek üst sınıfı içinde arayüzleri yapmaktır UML ekli. Bu şekilde argümanı func'e dökmeniz gerekmeyecek. Bu, karmaşıklığı kendi başına azaltmaz, ancak niyetinizi çok daha temiz hale getirir ve döküm ihtiyacını azaltır/ortadan kaldırır (her zaman iyi bir şey).
public abstract class Parent {
interface Interface1 {
//Specifications of methods that all child nested classes must have
}
interface Interface2 {
//Specifications of methods that all child nested classes must have
}
public abstract Interface2 func(Interface1 obj);
}
public class Child extends Parent {
private static class Impl1 implements Interface1 {
//Implementations of methods in Interface1 as they pertain to Child
}
private static class Impl2 implements Interface2 {
//Implementations of methods in Interface2 as they pertain to Child
}
@Override
public Interface2 func(Interface1 obj) {
//Should only have to use methods declared in Interface1
//Thus should have no need to cast obj.
//Will return an instance of Impl2
return null;
}
}
Daha geniş ölçekte, her çocuğun kendi yuvalanmış sınıf kümesine neden ihtiyaç duyduğunu kendinize sormalısınız. Yuvalanmış sınıf tanımlarını ebeveyne taşıyabiliyorsanız (ve bunları statik hale getirdiğinizde) ve yalnızca çocuk sınıflarının bunları yapım sırasında gerektiği gibi özelleştirebilmeniz daha kolay olacaktır.
Teşekkürler! . Yuvalanmış sınıfların tanımı tüm çocuklarda farklıdır. Bu yüzden onları ayrı statik sınıflar haline getiremiyorum. Tasarımı daha fazla geliştirebileceğimi düşünebilir misin? – mc20
Bu düşünce, tasarım sorusunun neden ebeveynte soyut yönteme ihtiyaç duyduğudur? Bende, "p = ..." adlı bir ailem var ve onun türünü bilmiyorum, belki de doğru args ile "p.func (...)" diyebilir miyim? Eğer soyut bir yönteme sahip olmanın bir anlamı yok ise – Mshnik