▽1
●
a-kuma3 ベストアンサー |
質問1: protected修飾子の使い方について
カプセル化を緩めたいのはどんなときでしょうか?
サブクラスからアクセス可能にするメリットは何でしょうか?
カプセル化を緩めるために使うわけじゃありません。
public class Base { ... } public class DerivedA extends Base { private void foo() { ... } public void bar() { foo(); ... } } public class DerivedB extends Base { private void foo() { ... // 実は、DerivedA::foo() と同じ処理 } public void qux() { foo(); ... } }
と書くよりも、以下のように書いた方が良いですよね。
public class Base { protected void foo() { // foo は、外に見せたくない(カプセル化) ... } } public class DerivedA extends Base { public void bar() { foo(); ... } } public class DerivedB extends Base { public void qux() { foo(); ... } }
質問2: メソッドのオーバーライドについて
スーパークラスでメソッドだけ定義し、サブクラスでメソッドをオーバーライドする場合があるようですが、スーパークラスのメソッド定義はなんのためにあるのでしょうか?
例えば、こんな感じ。
public Figure { /* 抽象化された「図形」クラスでは、どうやって描画して良いか分からない */ abstract public void draw(); } public Circle extends Figure { public void draw() { // 円の書き方は、分かる ... } } public Circle extends Square { public void draw() { // 四角形の書き方は、分かる ... } } public Foo { public void bar() { List<Figure> figureList = ...; for (Figure figure : figureList) { /* どんな図形が List に入ってるか分からなくても、描画はできる */ figure.draw(); ... } } }
他にも、デザインパターンのTemplate Method パターンなんかは、スーパークラスで抽象メソッドを定義しているのが肝ですよね。