C# 中的繼承、多型 extends implements

這類的資料google一下就會有,或著買本書參考一下亦可
我試著用最簡單方法來說明
良好的程式,應該要有良好的結構

用動物園舉例比較容易懂

一、動物園裡,所有動物都有名字,會動、吃、叫
  每個動物都會寫一次,一不小心其中某動物忘了寫「名字」的方法
  也挺困擾的

  寫抽像類別 Animal.cs 給各種動物去實作
  讓各種動物去繼承

二、有的動物會飛,有的動物會跑
  不會飛的動物,不需要實作「飛」這個方法

  寫個介面 IBirdAbility.cs 給會飛的動物去實作


以上是說明及目的。




步驟:
一、開啟專案,新增Animals的資料夾
二、結構大至如下圖:


三、其中Animal.cs 是抽象類別,Air中的IBirdAbility.cs 是介面
  Land及Air中的各方法皆繼承animail.cs
  唯有Eagle實作了IBirdAbility的方法
四、在Form1裡測試

程式碼:

Animal.cs

abstract class Animal
{
    /*
    public String Name { get; set; }
    public String Color { get; }
    public String Type { get; }
    */
        
    private String name;
    public String Name 
    {
        get { return this.name; }
        set { this.name = value; }
    }
         
    private String color;
    public String Color{get { return this.color; } }
        
    private String type;
    public String Type { get { return this.type; } }

        
    public Animal(String Type, String Name, String Color)
    {
        this.type = Type;
        this.name = Name;
        this.color = Color;
    }

    abstract public String Sound();
    abstract public String Eat();
    abstract public String Move();
        
    public override string ToString()
    {
        String result = "";
        result += String.Format("{0} 的名字為:{1}\r\n", this.type, this.name);
        result += String.Format("{0} 的顏色為:{1}\r\n", this.name, this.color);
        result += String.Format("{0} 的聲音為:{1}\r\n", this.name, this.Sound());
        result += String.Format("{0} 的吃:{1}\r\n", this.name, this.Eat());
        result += String.Format("{0} 的動作:{1}\r\n", this.name, this.Move());
        return result;
    }

}



Dog.cs,cat及horse都差不多這樣

class Dog : Animal
{
    //Dog繼承Animal,另外的cat.cs及horse.cs都一樣

    //建構子,其中的name及color由使用者賦予
    public Dog(String name, String color) : base("狗狗", name, color)
    { }

    //實作Sound()等各方法,注意override
    public override String Sound()
    {
        return "汪!汪!汪!";
    }
    public override String Eat()
    {
        return "肉肉!骨頭!";
    }
    public override String Move()
    {
        return "四隻腳,跑跑跳跳!";
    }
}



IBirdAbility.cs 介面方法

interface IBirdAbility
{
    String Fly();
}



Eagle.cs

class Eagle : Animal, IBirdAbility
{
    //Eagle 繼承了 Animal  實作 IBirdAbility(注意,可以多個實作,但繼承只有一個)
    public Eagle(String name) : base("老鷹", name, "褐白")
    { }

    public override string Sound()
    {
        return "啾啾啾";
    }

    public override string Eat()
    {
        return "小動物!";
    }

    public override string Move()
    {
        return "兩隻腳地上慢慢走!";
    }

    public string Fly()
    {
        return "飛得很快!飛得很高!";
    }

    public override string ToString()
    {
        String result = base.ToString();
        result +=  String.Format("{0} 的飛:{1}\r\n", this.Name, this.Fly());
        return result;
    }

}


在主程式中調用以上的方法

private void button1_Click(object sender, EventArgs e)
{
    String result = "";

    //Animals.Animal aa = new Animals.Animal("動物的種類","動物","顏色");
    //result += aa.ToString() + "\r\n";

    Dog dd = new Dog("小黃","黃");
    result += dd.ToString() + "\r\n";

    Cat cc = new Cat("小咪", "白");
    result += cc.ToString() + "\r\n";

    Horse hh = new Horse("小馬", "黑");
    result += hh.ToString() + "\r\n";

    Eagle ee = new Eagle("小鷹");
    result += ee.ToString() + "\r\n";

    textBox1.Text = result;

}

留言

熱門文章