Java에서이 다형성 동작을 수행하는 데는 두 가지 방법이 있습니다. 첫 번째는 상속과 계층 적 클래스 집합을 사용하는 것입니다. 예를 들어 "swim"이라는 추상 메서드를 정의하는 추상 기본 클래스를 가질 수 있습니다. 그런 다음 각 구체적인 물고기 클래스는이 기본 클래스를 확장하고 수영 메서드를 구현합니다. 나중에 물고기 개체 집합이있을 때 기본 클래스로 업 캐스트하고 각각에 대해 swim 메서드를 호출 할 수 있습니다.
두 번째 방법은 인터페이스를 사용하는 것입니다. 공용 메서드 수영을 선언하는 인터페이스 (예 : ISwim)를 정의합니다. 각 어류 클래스 (클래스 계층 구조 또는 아니요의 일부)는 ISwim 인터페이스를 구현하므로 수영 메서드를 정의합니다. 그런 다음 서로 다른 유형의 물고기 클래스 개체 집합이있는 경우 각각을 ISwim 인터페이스로 캐스팅하고 각 개체에서 swim 메서드를 호출 할 수 있습니다.
자바에는 기능 포인터가 없으므로 고려중인 접근 방식은 해당 언어에 적합하지 않습니다. 함수 포인터가있는 언어에서도 위의 두 가지 방법이 내 의견으로는 가장 적절할 것입니다.
public class Unit {
public enum UnitType {
REGULAR {
public Unit makeUnit() {
return new RegularUnit();
}
},
SPECIAL {
public Unit makeUnit() {
return new SpecialUnit();
}
};
abstract public Unit makeUnit();
}
protected Unit() {}
public abstract int swim();
private static class RegularUnit extends Unit {
RegularUnit() {}
public int swim() {
return 0;
}
}
private static class SpecialUnit extends Unit {
SpecialUnit() {}
public int swim() {
return 1;
}
}
}
Unit fish = UnitType.REGULAR.makeUnit();
Unit fatFish = UnitType.SPECIAL.makeUnit();
또 다른 방법은 Callable
개체입니다 :
public class Unit {
public enum UnitType { REGULAR, SPECIAL }
private Callable<Integer> additionFunc;
public Unit(UnitType type) {
switch (type) {
case REGULAR:
additionFunc = new Callable<Integer>() {
public Integer call() {
return 0;
}
};
break;
case SPECIAL:
additionFunc = new Callable<Integer>() {
public Integer call() {
return 1;
}
};
break;
}
}
public int swim() {
return additionFunc();
}
}
이 모든 답은 나를 노버 그 어느 때보 다 더 :) 이것이 내가 필요로하는 것에 가장 가까운 것 같습니다 –