1. 程式人生 > >【C#基礎】多型

【C#基礎】多型

實現多型的三種方式:虛方法、抽象類、介面

一、虛方法

如果父類中的方法有預設的實現,並且父類需要被例項化,這時可以考慮將父類定義成一個普通類,用虛方法來實現多型。

步驟:1、將父類的方法標記為虛方法 ,使用關鍵字 virtual

2、子類重寫父類的虛方法,使用關鍵字override

 class Program
    {
        static void Main(string[] args)
        {
            //父類物件裡面裝的是子類成員,物件employee依然表現為父類型別
            //但由於父類的方法被子類重寫,呼叫的是子類自己的方法   
            Employee employee= new Manager("張三",5000);
            employee.SayHello();                     
            Console.ReadKey();
        }
    }    

    /// <summary>
    /// 員工類
    /// </summary>
    public class Employee
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public Employee(string name)
        {
            this.Name = name;
        }

        //將父類方法標記為虛方法
        public virtual void SayHello()
        {
            Console.WriteLine("我是普通員工");
        }
    }

    /// <summary>
    /// 經理類
    /// </summary>
    public class Manager:Employee
    {
        private double _salary;
        public double Salary
        {
            get { return _salary; }
            set { _salary = value; }
        }
        public Manager(string name,double salary):base(name)
        {
            this.Salary = salary;
        }

        //重寫父類虛方法
        public override void SayHello()
        {
            Console.WriteLine("我是經理,我叫{0}我的薪資是{1}元",this.Name,this.Salary);
        }

    }

    /// <summary>
    /// 程式設計師類
    /// </summary>
    public class Programer : Employee
    {
        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        public Programer(string name,int age):base(name)
        {
            this.Age = age;
        }

        //重寫父類虛方法
        public override void SayHello()
        {
            Console.WriteLine("我是程式設計師,我{0}歲了",this.Age);
        }
    }

二、抽象類

當父類中的方法不知道如何去實現的時候,可以考慮將父類寫成抽象類,將方法寫成抽象方法。(例如動物類為父類,貓狗為子類,動物會叫,但具體不知到怎麼實現叫這個方法,此時可以將動物類標記為抽象類(使用關鍵字abstract),將叫這個方法標記為抽象方法)

抽象類特點:

1.抽象成員必須標記為abstract,並且不能有任何實現。
2.抽象成員必須在抽象類中。
3.抽象類不能被例項化
4.子類繼承抽象類後,必須把父類中的所有抽象成員都重寫。(除非子類也是一個抽象類,則可以不重寫)
5.抽象成員的訪問修飾符不能是private
6.在抽象類中可以包含例項成員。並且抽象類的例項成員可以不被子類實現
7.抽象類是有建構函式的。雖然不能被例項化。
8、如果父類的抽象方法中有引數,那麼。繼承這個抽象父類的子類在重寫父類的方法的時候必須傳入對應的引數。
9、如果抽象父類的抽象方法中有返回值,那麼子類在重寫這個抽象方法的時候 也必須要傳入返回值。

   class Program
    {
        static void Main(string[] args)
        {
        }
    }
    public abstract class Animal
    {
        public abstract void Bark();
    }

    public class Dog : Animal
    {
        public override void Bark()
        {
            Console.WriteLine("小狗汪汪叫");
        }
    }

三、介面

[public] interface I..able
{
    成員;
}

介面的特點:

1、介面是一種規範。只要一個類繼承了一個介面,這個類就必須實現這個介面中所有的成員
2、為了多型。介面不能被例項化。也就是說,介面不能new(不能建立物件)
3、介面中的成員不能加“訪問修飾符”,介面中的成員訪問修飾符預設為public,不能修改。
4、介面中的成員不能有任何實現(“光說不做”,只是定義了一組未實現的成員)。
5、介面中只能有方法、屬性、索引器、事件,不能有“欄位”和建構函式。
6、介面與介面之間可以繼承,並且可以多繼承。
7、介面並不能去繼承一個類,而類可以繼承介面  (介面只能繼承於介面,而類既可以繼承類,也可以繼承介面)
8、一個類可以同時繼承一個類並實現多個介面,如果一個子類同時繼承了父類A,並實現了介面IA,那麼語法上A必須寫在IA的前面。class MyClass:A,IA{},因為類是單繼承的。
9、當一個抽象類實現介面的時候,需要子類去實現介面。

10、顯示實現介面的目的:解決方法的重名問題
什麼時候顯示的去實現介面:
當繼承的介面中的方法和引數一摸一樣的時候,要是用顯示的實現介面