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