具象メソッドのabstract化

Javaを使って3,4年になるけど、今日新事実が発覚した。

具象メソッドはabstractでオーバーライドできる!

やはりJava言語仕様とかの詳しい本読んでおかないとダメだなと感じた日でした。

[tmkm-amazon]4894717158[/tmkm-amazon]

折角なのでちょろっとコード書いてみた。

[java]
public class Main {

	public abstract class Parent {
		public abstract void abstractPrintMessage();

		public void methodA(){
			System.out.println("Parent.methodA");
		}
	}

	public abstract class Child extends Parent{
		@Override
		public void abstractPrintMessage() {
			System.out.println("abstractPrintMessage was implemented by Child");
		}

		@Override
		public abstract void methodA();

	}

	public class Grandchild extends Child{

		@Override
		public void methodA() {
			System.out.println("methodA was implemented by Grandchild");
		}

	}

	public static void main(String[] args) {
		Main.Grandchild gc = new Main().new Grandchild();
		gc.abstractPrintMessage();
		gc.methodA();

	}

}

[/java]

出力結果
abstractPrintMessage was implemented by Child
methodA was implemented by Grandchild

内部クラス使ってるからpublic static void mainの中のnewが変なことになってるけど、本題からそれるので放置。

Childクラスで具象メソッドであるmethodAをabstract化して、そのサブクラスで実装してる。とりあえずabstract化できることは分かったよ・・・。

でも、これ何のメリットがあるわけ?

公開されているあるスーパークラス(Parent)を利用(extends)して継承前提のクラス(Child)を作ろうと思ったけど、あるメソッド(methodA)が目的と大きくそれるので利用者(Grandchild)にオーバーライド(というか実装?)してもらいたい。そこでそれを確実にするためにabstract化しておくことで安全にできる・・・みたいな?

うーん。。。こんなケースあるんだろうか。

まあとにかくabstract化できるということは覚えておこう。今日も少し勉強になった。

public class Main {

public abstract class Parent {
public abstract void abstractPrintMessage();

public void methodA(){
System.out.println(“Parent.methodA”);
}
}

public abstract class Child extends Parent{
@Override
public void abstractPrintMessage() {
// TODO 自動生成されたメソッド・スタブ
System.out.println(“abstractPrintMessage was implemented by Child”);
}

@Override
public abstract void methodA();

}

public class Grandchild extends Child{

@Override
public void methodA() {
System.out.println(“methodA was implemented by Grandchild”);
}

}

public static void main(String[] args) {
Main.Grandchild gc = new Main().new Grandchild();
gc.abstractPrintMessage();
gc.methodA();

}

}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です