抽象メソッドは、実装を持たないメソッドで、機能の実装は派生クラスで行います。抽象クラスはそれ自体インスタンスを作ることが出来ず、継承を前提として作られたクラスです。
以下に学習の時に使ったリストを示します。
/*
* 抽象クラスの学習
* 試しに抽象クラスの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メソッドがそれぞれオーバーライドされています。