C#中繼承和多型的研究

赤石俊哉發表於2019-02-16

C#中繼承和多型的研究

通常繼承

在這個部分,我將構建兩個類ABBA的子類。

namespace CSharpPolymorphism {
    class A {
        public string value = "A";
        public string Say() { return "I`m A, My Value: " + value; }
    }
    class B : A {
        public string value = "B";
        public string Say() { return "I`m B, My Value: " + value; }
    }
    class Program {

        static void Main(string[] args) {
            A Aa = new A();
            B Bb = new B();
            A Ab = new B();

            Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
            Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
            Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);

            // Pause
            Console.ReadLine();
        }
    }
}

執行結果為:

// I`m A, My Value: A, Got Value: A
// I`m B, My Value: B, Got Value: B
// I`m A, My Value: A, Got Value: A
  • 結果說明: I`m N 表示呼叫了N的方法, My Value: N 表示方法內部獲取到的值, Got Value: N 表示從外部直接訪問物件屬性得到的值。

由此可見,通常繼承中,若使用子類來例項化父類物件,不論從類的內部還是外部訪問這個物件,這個物件都會使用父類的屬性和方法。

父類定義虛方法,子類新建方法

在這個部分,我將構建兩個類ABBA的子類。 A中的方法定義為virtual虛方法,B中方法定義為new新建方法。

namespace CSharpPolymorphism {
    class A {
        public string value = "A";
        public virtual string Say() { return "I`m A, My Value: " + value; }
    }
    class B : A {
        public string value = "B";
        public new string Say() { return "I`m B, My Value: " + value; }
    }
    class Program {

        static void Main(string[] args) {
            A Aa = new A();
            B Bb = new B();
            A Ab = new B();

            Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
            Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
            Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);

            // Pause
            Console.ReadLine();
        }
    }
}

執行結果為:

// I`m A, My Value: A, Got Value: A
// I`m B, My Value: B, Got Value: B
// I`m A, My Value: A, Got Value: A

與前面的例子結果一樣,當子類新建父類的虛方法時,若使用子類來例項化父類物件,不論從類的內部還是外部訪問這個物件,這個物件都會使用父類的屬性和方法。

父類定義虛方法,子類覆蓋方法

在這個部分,我將構建兩個類ABBA的子類。 A中的方法定義為virtual虛方法,B中方法定義為override覆蓋方法。

namespace CSharpPolymorphism {
    class A {
        public string value = "A";
        public virtual string Say() { return "I`m A, My Value: " + value; }
    }
    class B : A {
        public string value = "B";
        public override string Say() { return "I`m B, My Value: " + value; }
    }
    class Program {

        static void Main(string[] args) {
            A Aa = new A();
            B Bb = new B();
            A Ab = new B();

            Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
            Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
            Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);

            // Pause
            Console.ReadLine();
        }
    }
}

執行結果為:

// I`m A, My Value: A, Got Value: A
// I`m B, My Value: B, Got Value: B
// I`m B, My Value: B, Got Value: A

在這個例子中,若使用子類來例項化父類物件,會呼叫子類的方法,而且在方法中獲取的屬性值是子類的,但是從外部直接訪問這個物件的屬性時,會使用父類物件的屬性值。

相關文章