breed
으로 "나를 만든 자녀"라고 가정 할 때 여러 가지 방법이 있습니다.
반사
먼저 반사를 사용하는 것입니다. 당신이 당신의 클래스에 대한 인자없는 생성자가있는 경우,이 Class.newInstance를 호출하는 것만 큼 쉽습니다 : 당신이 모든 서브 클래스에서 인자없는 생성자가없는 경우
public Animal breed() {
try {
return (Animal) getClass().newInstance();
} catch (Exception ex) {
// TODO Log me
return null;
}
}
, 당신은이해야합니다 모든 하위 클래스 전반에 걸쳐 균일 한 생성자. 당신이 Cat(int, String)
및 Dog(int, String)
이있는 경우 예를 들어, 당신은 Class.getConstructor
를 통해 생성자를받을 수 있도록에 newInstance
를 호출해야합니다
return (Animal) getClass().getConstructor(int.class, String.class).newInstance(0, "Unnamed");
int
여기 String
예를 들어 나이와 이름 일 수있다. 리플렉션을 통해이를 수행하는 방법입니다. 그런 다음 추상 클래스는 생성자에서이 인스턴스을 가지고
public interface Provider<T> {
T create();
}
:
공급자
또 다른 방법이 간단한 인터페이스를 사용하는 것입니다
public abstract class Animal {
private final Provider<Animal> animalProvider;
protected Animal(... , Provider<Animal> animalProvider) {
// ...
this.animalProvider = animalProvider;
}
public Animal breed() {
return animalProvider.create();
}
}
그런 다음 서브 클래스는 서브 클래스의 새로운 인스턴스를 생성하는 수퍼 클래스에 Provider<Animal>
을 전달합니다 :
public class Dog extends Animal {
public Dog(...) {
super(... , new DogProvider());
// ...
}
private static class DogProvider implements Provider<Animal> {
public Animal create() {
return new Dog(...);
}
}
}
다른 하위 클래스도 마찬가지입니다.
참고 :breed
에 의해 "나를 입력하십시오"라는 뜻인 경우 질문을 수정해야합니다. 나는 데이터 컨테이너 방법에 대한 get
/set
표기 규칙에 따라 권장
public abstract class Animal {
protected final Breed breed;
protected Animal(... , Breed breed) {
// ...
this.breed = breed;
}
public Breed getBreed() {
return breed;
}
}
: 이것은 당신이 무엇을 의미하는지 경우, 다음이 가능한 솔루션입니다. Java는 이러한 명명 규칙을 처리하도록 설계된 bean 클래스를 가지고 있으며, 많은 플랫폼에서 어느 정도 표준입니다. 당신의 서브 클래스 :
public class Dog extends Animal {
public Dog(...) {
super(... , new Breed(...));
// ...
}
}
예는, 클래스의 모든 메소드가 –
@SashiKant 추상적해야 할 필요는 없다 그러나 그것은'InstantiationException'을 던졌습니다. –