2012年11月19日 星期一

base 用法

: base(...)

base 關鍵字是衍生類別用來存取父類別的成員,它有以下二個情況會使用到:

1. 呼叫基底類別中的方法

在衍生類別中,若要執行基底類別中的方法,就要使用 base 關鍵字去叫用基底類別的方法。

public class Person
{
    protected string ssn = "444-55-6666";
    protected string name = "John L. Malgraine";

    public virtual void GetInfo()
    {
        Console.WriteLine("Name: {0}", name);
        Console.WriteLine("SSN: {0}", ssn);
    }
}
class Employee : Person
{
    public string id = "ABC567EFG";
    public override void GetInfo()
    {
        // 呼叫父類別的 GetInfo 方法:
        base.GetInfo();
        Console.WriteLine("Employee ID: {0}", id);
    }
}

private void frmBase_Load(object sender, EventArgs e)
{
    Employee emp = new Employee();
    emp.GetInfo();
    //Name: John L. Malgraine
    //SSN: 444-55-6666
    //Employee ID: ABC567EFG
}

2. 呼叫基底類別的建構函式

另一種狀況是,若 derived-class 的 constructor 的參數,實際上是 base-clas s的資料,這時候就可以使用 base 關鍵字去呼叫 base-class 的 constructor。

因為在物件的繼承行為中,建構函式是不會被繼承的,所以若想在衍生類別的建構函式中,直接利用基底類別建構函式中的程式碼,就會遇到這種狀況。

public class Person
        {
            public Person(string name)
            {
                Console.WriteLine("My name is " + name);
            }
        }
        public class Student : Person
        {
            public Student(string name, int age) 
                : base(name)
            {
                Console.WriteLine("I am " + age.ToString() + " years old");
            }
        }

: this(...)

若一個類別中有多個 constructor ,如果這些建構函式中有些程式可以共用,你就可以利用 : this() 語法。 也是說在同一個類別中叫用另一個建構函式。

public class Person
    {
        public Person(string name)
        {
            Console.WriteLine("My name is " + name);
        }
        public Person(string name, int age) : this(name)
        {
            Console.WriteLine("I am " + age.ToString());
        }
        public Person(string name, int age, string city)
            : this(name, age)
        {
            Console.WriteLine("I live in " + city);
        }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Person person = new Person("vito", 20, "taipei");
    }

在過去 C#3.5 還不支援選則性參數(optional parameter)時,就常使用這個方法來模擬選則性參數的功能。

public class Person
    {
        public Person(string name)
            : this(name, 20, "taipei")
        {
            Console.WriteLine("My name is " + name);
        }
        public Person(string name, int age) 
            : this(name, age, "taipei")
        {
            Console.WriteLine("I am " + age.ToString());
        }
        public Person(string name, int age, string city)
        {
            Console.WriteLine("I live in " + city);
        }
    }

沒有留言:

張貼留言