參考:http://www.cnblogs.com/oomusou/archive/2007/01/13/619310.html
using System;
using System.Collections.Generic;
//物件導向特性 - 「抽象」、「封裝」、「繼承」、「多型」
//定義學生的抽象類別,將抽象性函式介面的實作細節部份包裝、隱藏起來做封裝,確保使用者無法任意更改物件內部的重要資料
abstract class Student
{
//內部欄位
private string _name;
private int _grade;
//建構子 (可以有多個建構子,只要帶的傳遞參數不同即可)
protected Student()
{
this._name = "無名氏";
this._grade = 1;
}
//建構子 (與方法的區別在不定義傳回值型別)
protected Student(string name)
{
this._name = name;
}
//建構子
protected Student(string name, int grade)
{
this._name = name;
this._grade = grade;
}
//屬性 (與方法的區別在無任何傳遞參數,所以沒有『()』)
public int grade
{
get
{
return _grade;
}
set
{
_grade = value;
}
}
//方法 (可以有多個同名方法,只要帶的傳遞參數不同即可)
public string getName()
{
return this._name;
}
// 衍生類別必須強制實作出有宣告為 abstract 的方法
public abstract string job();
}
// 學士繼承學生類別,並實作界面
class Bachelor : Student
{
// 繼承基礎類別
public Bachelor() : base() { }
public Bachelor(string name, int grade) : base(name, grade) { }
// 重載部份方法
public override string job()
{
return "學士";
}
}
class Master : Student
{
public Master(string name) : base(name) { }
public Master(string name, int grade) : base(name, grade) { }
public override string job()
{
return "研究生";
}
}
//定義實驗室的類別
class Lab
{
//宣告member是一個內容為學生類別的List清單
private List<Student> member = new List<Student>();
public void add(Student student)
{
this.member.Add(student);
}
//列出所有成員
public void listAllJob()
{
foreach (Student student in this.member)
{
Console.WriteLine("{0}'s job:{1} grade:{2}", student.getName(), student.job(), student.grade);
}
}
}
class MainClass
{
public static void Main()
{
//使用不同方法宣告為學士、研究生等成員
Bachelor John = new Bachelor();
Bachelor Lisa = new Bachelor("Lisa", 4);
Master Mary = new Master("Mary");
Master Ken = new Master("Ken", 2);
//透過多型,將成員加入實驗室中
Lab CSLab = new Lab();
CSLab.add(John);
CSLab.add(Lisa);
CSLab.add(Mary);
CSLab.add(Ken);
CSLab.listAllJob();
Console.ReadKey(true);
}
}
/*結果
無名氏's job:學士 grade:1
Lisa's job:學士 grade:4
Mary's job:研究生 grade:0
Ken's job:研究生 grade:2
*/