平成29年秋期問7

答えはイです。
オーバーライドについて
**オーバーライド(override)**とは、プログラミングにおいて、親クラス(スーパークラス)のメソッドを、子クラス(サブクラス)で再定義することを指します。

オーバーライドの特徴
• 継承を利用する
• 親クラスのメソッドと同じ名前、引数、戻り値の型で定義する
• 親クラスのメソッドを上書きして、子クラス独自の振る舞いを実装できる

オーバーライドの例(Java)

// 親クラス(スーパークラス)
class Animal {
   void makeSound() {
       System.out.println("動物の鳴き声");
   }
}

// 子クラス(サブクラス)
class Dog extends Animal {
   @Override
   void makeSound() {
       System.out.println("ワンワン!");
   }
}

public class Main {
   public static void main(String[] args) {
       Animal myDog = new Dog();
       myDog.makeSound(); // "ワンワン!"と出力される
   }
}

オーバーライドのポイント
1. @Override アノテーション(Javaなど)
• 書くことで、間違ったオーバーライドを防げる(例えば、親クラスに同じ名前のメソッドがない場合、エラーになる)
2. 親クラスのメソッドと同じシグネチャ(メソッド名・引数・戻り値)にする
3. アクセス修飾子を親クラスと同じか、それより広い範囲にできる(privateはオーバーライド不可)


外部から隠蔽するのでカプセル化の説明


オーバーロードの説明です。hello(性別)と hello(
性別,年齢)など引数が異なる同名の関数を同一クラス内に定義することです。

**オーバーロード(Overload)**とは、同じ名前のメソッドや関数を、異なる引数の組み合わせで定義することを指します。

オーバーロードの特徴
• メソッド名は同じだが、引数の型や数が異なる
• 戻り値の型が異なるだけではオーバーロードにならない
• コンパイル時にどのメソッドを呼び出すか決まる(コンパイル時多態性)

オーバーロードの例(Java)

class MathUtils {
   // 2つの整数を足す
   int add(int a, int b) {
       return a + b;
   }

   // 3つの整数を足す(引数の数が異なる)
   int add(int a, int b, int c) {
       return a + b + c;
   }

   // 2つの小数を足す(引数の型が異なる)
   double add(double a, double b) {
       return a + b;
   }
}

public class Main {
   public static void main(String[] args) {
       MathUtils mu = new MathUtils();
       
       System.out.println(mu.add(2, 3));       // 5
       System.out.println(mu.add(2, 3, 4));    // 9
       System.out.println(mu.add(2.5, 3.5));  // 6.0
   }
}

オーバーロードのポイント
1. メソッド名は同じ
2. 引数の数・型が異なればOK
3. 戻り値の型だけを変えてもダメ(コンパイルエラー)

◾︎補足
・メソッドに関連する概念

1. メソッドのオーバーロード(Overloading)
• 同じ名前のメソッドを、異なる引数のパターンで定義すること

class MathUtils {
   public int add(int a, int b) {
       return a + b;
   }

   public double add(double a, double b) {
       return a + b;
   }
}

2. メソッドのオーバーライド(Overriding)
• 親クラスのメソッドを、子クラスで上書きすること

class Animal {
   public void makeSound() {
       System.out.println("動物の鳴き声");
   }
}

class Dog extends Animal {
   @Override
   public void makeSound() {
       System.out.println("ワンワン!");
   }
}


汎化の説明です。例えば、りんごクラス、みかんクラス、ももクラスに共通の特性を集めて果物クラスを作ることです。

汎化(はんか, Generalization)とは?

◾︎汎化(Generalization)とは、複数の具体的なもの(サブクラス)の共通部分を抽出し、より一般的な概念(スーパークラス)を作ることを指します。

オブジェクト指向プログラミング(OOP)において、汎化は「継承(inheritance)」の一種で、共通のプロパティやメソッドを親クラスにまとめるときに使われます。

汎化のイメージ

例えば、以下のようなクラスがあるとします。
• 犬(Dog) → 鳴く(bark)、走る(run)
• 猫(Cat) → 鳴く(meow)、走る(run)

**共通する動作「走る(run)」があるので、それを「動物(Animal)」というスーパークラス(親クラス)**にまとめるのが「汎化」です。

Javaでの汎化の例

// 汎化されたスーパークラス(親クラス)
class Animal {
   String name;

   void run() {
       System.out.println(name + " は走っている");
   }
}

// サブクラス(子クラス)
class Dog extends Animal {
   void bark() {
       System.out.println(name + " はワンワンと鳴く");
   }
}

class Cat extends Animal {
   void meow() {
       System.out.println(name + " はニャーニャーと鳴く");
   }
}

public class Main {
   public static void main(String[] args) {
       Dog dog = new Dog();
       dog.name = "ポチ";
       dog.run();  // "ポチ は走っている"
       dog.bark(); // "ポチ はワンワンと鳴く"

       Cat cat = new Cat();
       cat.name = "ミケ";
       cat.run();  // "ミケ は走っている"
       cat.meow(); // "ミケ はニャーニャーと鳴く"
   }
}

汎化のメリット
1. コードの再利用性が向上(共通部分を親クラスにまとめられる)
2. 拡張性が高くなる(新しいサブクラスを追加しやすい)
3. コードの整理ができる(共通の機能が一箇所にまとまる)

汎化と特化の違い

概念 説明
汎化(Generalization) 複数のクラスの共通部分を抽出して、親クラスにまとめる(具体 → 抽象)
特化(Specialization) 親クラスを継承し、新しい機能を追加して子クラスを作る(抽象 → 具体)

例えば、
• 「犬」「猫」 → 「動物」 にまとめるのが「汎化」
• 「動物」 → 「ペット(飼い主情報を追加)」 にするのが「特化」

まとめ
• 汎化は、共通する部分を抜き出して親クラスを作ること
• オブジェクト指向の「継承」を活用する
• コードの再利用や拡張性を向上させる

具体的な言語(Python, C++, JavaScriptなど)での汎化も知りたい?

引用元
https://www.fe-siken.com/s/kakomon/29_aki/q7.html
ChatGPT

いいなと思ったら応援しよう!