2013年9月11日 星期三
物件導向實例
using System;
using System.Collections.Generic;
//物件導向特性 - 「抽象」、「封裝」、「繼承」、「多型」
//定義介面
interface ICourse
{
void ChineseStudy(); //宣告方法 ChineseStudy (不可實作)
}
interface ISecondCourse : ICourse //繼承 ICourse 介面
{
void EnglishStudy(); //宣告方法 EnglishStudy (不可實作)
}
//定義學生的基礎類別,將細節部份包裝、隱藏起來做封裝,確保使用者無法任意更改物件內部的重要資料
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 的方法強制子類別一定得覆寫 (不可實作)
//衍生類別有宣告為 virtual 的方法允許被子類別覆寫 (須先實作),子類別可直接繼承,不一定要覆寫
public virtual string job()
{
return "學士";
}
}
//學士繼承學生類別 (繼承的基礎類別只能一個,但介面可有多個)
class Bachelor : Student, ICourse
{
//繼承基礎類別
public Bachelor() : base() { }
public Bachelor(string name, int grade) : base(name, grade) { }
////覆寫部份方法 (宣告 virtual 可直接用基礎類別的方法,不一定要覆寫)
//public override string job()
//{
// return "大學生";
//}
//實作介面 ICourse 的 ChineseStudy 方法
public void ChineseStudy()
{
Console.WriteLine("{0}學習一般中文課程", this.getName());
}
}
class Master : Student, ISecondCourse
{
public Master(string name) : base(name) { }
public Master(string name, int grade) : base(name, grade) { }
public override string job()
{
return "研究生";
}
//實作介面 ICourse 的 ChineseStudy 方法
public void ChineseStudy()
{
Console.WriteLine("{0}學習進階中文課程", this.getName());
}
//實作介面 ISecondCourse 的 EnglishStudy 方法
public void EnglishStudy()
{
Console.WriteLine("{0}學習英文課程", this.getName());
}
}
//定義實驗室的類別
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);
switch (student.job())
{
case "研究生":
Master s1 = (Master)student;
s1.ChineseStudy();
s1.EnglishStudy();
break;
default:
Bachelor s2 = (Bachelor)student;
s2.ChineseStudy();
break;
}
}
}
}
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
Lisa學習一般中文課程
Mary's job:研究生 grade:0
Mary學習進階中文課程
Mary學習英文課程
Ken's job:研究生 grade:2
Ken學習進階中文課程
Ken學習英文課程
*/
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言