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學習英文課程
*/

沒有留言:

張貼留言