C# 物件導向程式設計(Object-oriented programming,OOP) (三) 繼承

繼承(Inheritance):描述依據現有類別來建立新類別的能力。

一個物件A得到另一個物件B特性的過程稱為“A繼承B”,物件B則屬於“父類別”或稱基礎類別(Base class),物件A則屬於子類別或稱為衍生類別(Derived class)。

本文以C#實作執行介紹。

 

子類別可以繼承父類別的能力,直接使用父類別非私有的屬性和方法。
子類別只能繼承一個父類別。
父類別的方法若宣告為虛擬(virtual),則表示該方法可以被子類別覆寫(非必需)。
父類別的方法若宣告為抽象(abstract),則表示該子類別一定要覆寫該方法(子類別為抽象類別除外)。
類別若包含抽象成員,則該類別必需宣告為抽象類別。
父類別又叫做基底類別(Base Class)。
子類別又叫做衍生類別(Derived Class)。
若方法或屬性宣告為密封(sealed),則不可以被子類別覆寫 

先定義父類別(基底類別):

class Employee //定義Employee員工類別
    {
        private int _salary; //Employee員工類別有Salary薪水屬性
        public int Salary
        {
            get
            {
                return _salary;
            }
            set
            {
                if (value < 20000) //薪水最少20000
                    _salary = 20000;
                else if (value > 40000) //薪水最多40000
                    _salary=40000;
                else
                    _salary = value;
            }
        }
    }

定義子類別(衍生類別)來繼承父類別:

 //Manager經理類別繼承自Employee員工類別
    class Manaeger : Employee
    {
        public int Bonus { get; set; }//加入Bonus獎金屬性
        public void ShowTotal()
        {
            Console.WriteLine("實領薪水:{0}",Bonus+Salary);
        }
    }

讓我們來看看這個方法:

public void ShowTotal()
        {
            Console.WriteLine("實領薪水:{0}",Bonus+Salary);
        }

Salary屬性是子類別繼承自父類別,可以直接使用,而無須額外宣告。

以下是完整程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inherits
{
    class Employee //定義Employee員工類別
    {
        private int _salary; //Employee員工類別有Salary薪水屬性
        public int Salary
        {
            get
            {
                return _salary;
            }
            set
            {
                if (value < 20000) //薪水最少20000
                    _salary = 20000;
                else if (value > 40000) //薪水最多40000
                    _salary=40000;
                else
                    _salary = value;
            }
        }
    }

    //Manager經理類別繼承自Employee員工類別
    class Manaeger : Employee
    {
        public int Bonus { get; set; }//加入Bonus獎金屬性
        public void ShowTotal()
        {
            Console.WriteLine("實領薪水:{0}",Bonus+Salary);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Employee Jerry = new Employee();//建立Employee員工類別的Jerry物件
            Jerry.Salary = 40000;//設定薪水
            Console.WriteLine("Jerry員工薪水{0}",Jerry.Salary);//顯示薪水
            Console.WriteLine("==========");
            Console.WriteLine();
            Manaeger Squell = new Manaeger();//建立Manager經理類別Squell物件
            Squell.Salary = 50000;//設定薪水
            Console.WriteLine("Squell經理薪水{0}",Squell.Salary);//顯示薪水
            Squell.Bonus = 30000;//設定Squell的獎金30000
            Console.WriteLine("Squell經理獎金{0}",Squell.Bonus);
            Squell.ShowTotal();//顯示Squell實領薪水

            Console.ReadKey();
        }
    }
}

執行結果如下:

若方法或屬性宣告為密封(sealed),則不可以被子類別覆寫範例程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace @sealed
{
    class X
    {
        public virtual void F() { Console.WriteLine("X.F"); }
        public virtual void F2() { Console.WriteLine("X.F2"); }
    }
    class Y : X
    {
        sealed public override void F() { Console.WriteLine("Y.F"); }
        public override void F2() { Console.WriteLine("Y.F2"); }
    }

    class Z : Y
    {
        // Attempting to override F causes compiler error CS0239.
        //public override void F() { Console.WriteLine("C.F"); }

        // Overriding F2 is allowed.
        public override void F2() { Console.WriteLine("Z.F2"); }
    }

    class Program
    {
        static void Main(string[] args)
        {
            X x = new X();
            Y y = new Y();
            Z z = new Z();

            x.F();
            x.F2();
            y.F();
            y.F2();
            z.F();
            z.F2();

            Console.Read();
        }
    }
}

在Z繼承Y的時候,因為Y當中的F已經被宣告成sealed了,所以Z並不能去覆寫類別Y當中的F方法,如果覆寫的話會出現錯誤:

 // Attempting to override F causes compiler error CS0239.
 //public override void F() { Console.WriteLine("C.F"); }

執行結果如下:

虛擬(virtual)和抽象(abstract)的介紹和多型有密切的關聯,故將在" C# 物件導向程式設計(Object-oriented programming,OOP) (四) 多型" 中介紹。

 

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace