그래서 두 개의 클래스가 있습니다. 하나는 추상적이다 :이 모든 클라이언트에 공통해야하기 때문에 자바 추상 클래스 혼란 : 오버라이드 된 메소드가 호출되지 않음
public class BasicClient extends AbstractClient {
private IBasicServer basicServer;
public static void main(String[] args) {
new BasicClient();
}
public BasicClient() {
try {
System.setSecurityManager(new RMISecurityManager());
Registry registry = LocateRegistry.getRegistry();
basicServer = (IBasicServer) registry.lookup(IBasicServer.LOOKUPNAME);
run();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
void displayOptions() {
BasicClientOptions.displayOptions();
}
@Override
void processInputCommand(String input) {
// TODO Auto-generated method stub
}
}
지금 하위 클래스에서 나는 추상 클래스의 run() 메소드를 호출
public abstract class AbstractClient {
protected boolean running = true;
protected void run() {
Scanner scanner = new Scanner(System.in);
displayOptions();
while (running) {
String input = null;
while (scanner.hasNext()) {
input = scanner.next();
}
processInputCommand(input);
}
}
abstract void displayOptions();
abstract void processInputCommand(String input);
}
하나는 구상 서브 클래스입니다. run() 메소드 내에서 abstract 메소드 displayOptions()를 호출합니다.
서브 클래 싱 된 displayOptions()를 재정의 했으므로 서브 클래 싱 된 메소드를 호출 할 것이라고 생각했지만 그렇지 않은 것 같습니다. 이 작업을 수행 할 수있는 방법이 있습니까? 아니면 내가 명백한 실수를했거나 추상 클래스가 어떻게 작동해야하는지 오해 했습니까?
P.S 나는 서브 클래 싱 된 displayOptions() 내에 print 문을 두어 보았습니다.이 메서드는 호출하는 메서드로 어떤 일을하지 않았는지 확인했습니다.
많은 감사,
내 자신의 게시물에 대한 의견, 나는 그 프로세스 스캐너를 그대로두고 프로세스 입력 쿼리를 차단하지 않도록 추가해야합니다. 즉, processInputCommand()는 제대로 호출되지 않습니다. 그래서 나는 스캐너를 \ fo \ r \ nbar \ r \ n 하드 코딩하여 borked했습니다. 데모 용으로 더 많은 기능을 제공합니다. 죄송합니다. –