我們今天來說說virtual和override

首先先看個例子

class Employee
{
    public string Name
    {
        get
        {
            return "EmployeeName";
        }
        set
        {
            Name = value;
        }
    }
    public void printName()
    {
        Console.WriteLine("Employee Name is " + Name );
    }
}

class Worker : Employee
{
    public string Name
    {
        get
        {
            return "WorkerName";
        }
        set
        {
            Name = value;
        }
    }
    
    public string rank = "C";
    public void printName()
    {
        Console.WriteLine( "Worker Name is " + Name);
    }
}

上面這個例子Employee是父類別,而Worker是繼承Employee的子類別

Employee裡面有一個屬性是Name及一個方法是printName(),而Worker中有和Employee相同的屬性Name和方法printName().

這時子類別就會隱藏父類別相的名稱的屬性和方法,所以當我們分別去執行父類別和子類別的printName()時

static void Main()
{
    Employee e1 = new Employee();
    e1.printName();
    Worker e2 = new Worker();
    e2.printName();
}

結果如下

Employee Name is EmployeeName
Worker Name is WorkerName

這時你一定會有個疑問,virtual是宣告我的屬性或方法是可以改寫的,而override是去改寫宣告為virtual的屬性或方法.

但在上例中不是就已經達到我們所需要的結果了嗎??那何必再多此一舉去宣告virtual和override,難道只是為了標識而己嗎??

為了這個疑問,我們再來看第二個例子,這次我們會將Worker的物件塞到Employee裡,因為子物件塞到父類是可行的.

static void Main()
{
    Employee e1 = new Employee();
    e1.printName();
    Employee e2 = new Worker();
    e2.printName();
}

這時你執行後得到的結果如下

Employee Name is EmployeeName
Employee Name is EmployeeName

怪了...我不是在Worker裡重新定義了Name和printName()了嗎??為什麼塞到父類別裡,就全用了父類別的定義了呢??

所以囉....這就是virtual和override的使用時機,修改一下例子

class Employee
{
    public virtual string Name
    {
        get
        {
            return "EmployeeName";
        }
        set
        {
            Name = value;
        }
    }
    public virtual void printName()
    {
        Console.WriteLine("Employee Name is " + Name );
    }
}

class Worker : Employee
{
    public override string Name
    {
        get
        {
            return "WorkerName";
        }
        set
        {
            Name = value;
        }
    }
    
    public string rank = "C";
    public override void printName()
    {
        Console.WriteLine( "Worker Name is " + Name);
    }
}

如上例,我在父類別的屬性及方法加上了virtual修飾詞,另外在子類別的屬性及方法加上了override的修飾詞

這時我們再重新執行一次,得到的結果如下

Employee Name is EmployeeName
Worker Name is WorkerName

結果正確了,由上面的例子就能知道virtual和override的用法了.

 

arrow
arrow
    創作者介紹
    創作者 痞客興 的頭像
    痞客興

    痞客興的部落格

    痞客興 發表在 痞客邦 留言(2) 人氣()