だから私は2つのクラスがあります。1つは抽象的です:
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);
}
1つは具体的なサブクラスです。
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()メソッドを呼び出します。これは、すべてのクライアントに共通である必要があるためです。run()メソッド内には、抽象メソッドdisplayOptions()の呼び出しがあります。
サブクラスのdisplayOptions()をオーバーライドしたので、サブクラス化されたメソッドを呼び出すと想定しましたが、そうではないようです。これを行う方法はありますか、それとも明らかな間違いを犯したか、抽象クラスがどのように機能するかを誤解しましたか?
PSサブクラス化されたdisplayOptions()内にprintステートメントを入れて、呼び出したメソッドで何かしらなことをしていないことを確認しました。
どうもありがとう、
アダム