ラベル 抽象メソッド の投稿を表示しています。 すべての投稿を表示
ラベル 抽象メソッド の投稿を表示しています。 すべての投稿を表示

2018年2月21日水曜日

抽象メソッド、抽象クラス

継承に関係する事柄が続きます。今回は抽象メソッドと、抽象クラスです。

抽象メソッドは、実装を持たないメソッドで、機能の実装は派生クラスで行います。抽象クラスはそれ自体インスタンスを作ることが出来ず、継承を前提として作られたクラスです。

以下に学習の時に使ったリストを示します。

/*
 * 抽象クラスの学習
 * 試しに抽象クラスのoverrideをしないでコンパイルするとエラーになる。
 * 必ずoverride必要
 */
 
using System;

namespace sample10
{
    class Program
    {
        static void Main(string[] args)
        {
            Student p = new Student();
            p.name = "Gustav";
            p.grade = 2;
            p.printData();
            Employee e = new Employee();
            e.name = "MIE";
            e.position = "president";
            e.printData();
            Console.ReadKey();
        }
    }

    abstract class Person
    {
        public abstract void printData();
    }

    class Student : Person
    {
        public String name;
        public int grade;
        public override void printData()
        {
            Console.WriteLine("name: " + name + ", grade: " + grade + ".");
        }
    }

    class Employee : Person
    {
        public String name;
        public String position;
        public override void printData()
        {
            Console.WriteLine("Hi, my name is " + name + ". my position is " + position + ".");
        }
    }
}

abstruct class Personが抽象クラスです。その中のメンバーとして書かれているpublic abustruct void printData()が抽象メソッドになります。ここにはメソッドの実装はなく、抽象クラスPersonのメンバーとして抽象メソッドのprintDataがある、ということしか定義されていません。この内容では、メソッドの実装がないので、当然ながらインスタンスの生成はできません。

その下で、StudentクラスとEmployeeクラスが、Personクラスを基底クラスとした派生クラスとして定義されています。

Personクラスでは抽象メソッドとして書かれていたprintData()メソッドは、これらの派生クラス内で、オーバーライドするメソッドとして定義されています。

これを実行すると、

MacBook-Pro:sample10 gustav$ mcs Program.cs
MacBook-Pro:sample10 gustav$ mono Program.exe
name: Gustav, grade: 2.
Hi, my name is MIE. my position is president.

という結果になります。当然ながらStudentクラスではStudentクラスの、EmployeeクラスではEmployeeクラスのprintDataメソッドがそれぞれオーバーライドされています。