私は2つのクラスを持っています。一つは、抽象的です:Java抽象クラスの混乱:オーバーライドされたメソッドが呼び出されていない
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);
}
一つは具象サブクラスです:
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()をオーバーライドしていますので、サブクラス化されたメソッドを呼び出すと仮定しましたが、そうではないようです。これを行う方法はありますか、または私は明白な間違いを犯したのでしょうか、または抽象クラスがどのように機能すべきか誤解しましたか?
P.Sサブクラス化されたdisplayOptions()内にprintステートメントを入れて、私が呼び出すメソッドで何かダフトをしていないことを確認しました。
多くのおかげで、
コメントは、私があるようTEHスキャナを残し、任意の入力は文句を言わないrighty離れて呼び出すことが)のでprocessInputCommandを(ブロックする持っていないことを追加する必要があります。だからこそ私はあなたのスキャナを、\\ \ n \ bar \ r \ nをそれにハードコーディングしていた。デモのための詳細。 申し訳ありません。 –