티스토리 뷰
You can use polymorphism to solve that problem.
First define the base class/abstract class/interface with the method generateItem(), derive specified classes and override/implement generateItem() method.
Here is implementation with interface:
interface Base{
void generateItem();
}
class Derived1 implements Base{
@Override
public void generateItem() {
System.out.println("generateItem() from Derived1");
}
}
class Derived2 implements Base{
@Override
public void generateItem() {
System.out.println("generateItem() from Derived2");
}
}
class Main {
public static void main(String[] args) {
List<Base> list = new ArrayList<>();
list.add(new Derived1());
list.add(new Derived2());
list.forEach(Base::generateItem);
}
}
출력은 다음과 같습니다.
generateItem() from Derived1
generateItem() from Derived2
자세한 내용은 여기에서 다형성에 대해 읽을 수 있습니다 .
-------------------관용적 접근 방식은 추상적 정의하는 것입니다 generateItem()
에를 Enchant
. Enchant
어떤 이유로 든 수정할 수없는 경우 의 추상 하위 클래스를 Enchant
만들고 모든 하위 클래스가이를 상속하도록 할 수 있습니다 .
generateItem()
모든 하위 클래스가 인터페이스 유형을 구현하고 .NET Framework에 저장 하는 인터페이스를 만들 수도 있습니다 ArrayList
.
어떤 이유로 든 이러한 작업을 수행 할 수 없다면 디자인을 재고해야합니다. 그러나 마지막 수단으로 리플렉션을 사용하여 generateItem
각 개별 하위 클래스 에 동적으로 액세스 할 수 있습니다 . 그냥 전화 .getClass()
하고 방법을 조회하고 호출합니다.
Enchant
서브 클래스가 구현해야하는 추상 메서드를 제공 합니다. 추상적으로 만드는 것은 Enchant
메서드의 정의가 필요하지 않지만 하위 클래스는 필요하다는 것을 의미 합니다.
public class Enchant {
public abstract Item generateItem();
}
이 메서드는 static
코드에 있는 메서드가 아니어야 합니다. 의 인스턴스에서 호출하기 때문에 인스턴스 메서드 여야합니다 Enchant
.
인터페이스 또는 추상 클래스로 인챈트를 만들고 파생 클래스에서 확장
출처
https://stackoverflow.com/questions/39940086