物件導向特性實例

2013061311:54

參考: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
*/