C#中使用派生類更改基類的數據和行爲

這篇東西主要是爲了瞭解C#中使用派生類更改基類的數據和行爲,C#提供兩種方法:一是使用new的派生成員替換基成員;二是重寫虛擬的基成員(Override和Virtual)。還有介紹實現了類的接口強制轉換爲接口的時候,轉換後仍是能調用類中定義好的接口。直接看代碼:

using System;

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

namespace test6
{
    class Program
    {


        static void Main(string[] args)
        {
            B b = new B();
            A a = new A();
            //在1和2,因爲B類只是用了new來替換A類中的AA()方法,這種方式不是繼
            //承多態性,b在強制轉化爲A類時調用AA(),是調用基類A的方法,而不是
            //b用new替換A類中的AA()方法。
            //而3和4,用的是virtual和override來實現繼承多態性,因此這種方式既
            //使把b強制轉化爲A類時調用AA(),也是b類中覆蓋的AA()方法
            Console.WriteLine("直接從B類中調用b.AA():");//1
            b.AA();
            Console.WriteLine("直接從B類中調用((A)b).AA():");//2
            ((A)b).AA();
            Console.WriteLine("直接從B類中調用b.AAA():");//3
            b.AAA();
            Console.WriteLine("直接從B類中調用((A)b).AAA():");//4
            ((A)b).AAA();

            //這個說明類即便是強制轉化了接口也不會掉失實現接口內容。
            //如:A類中實現了接口A並要輸出必定的內容,可是繼承A類的B類轉換爲接口
            //Inter的時候,仍是能實現A類定義了接口Inter中的內容,即((Inter)b).InterA()。
            Console.WriteLine("直接從B類中調用b.InterA():");
            b.InterA();
            Console.WriteLine("直接從B類中調用((Inter)b).InterA():");
            ((Inter)b).InterA();
            Console.WriteLine("結束.....");
            Console.ReadKey();
        }
    }

    interface Inter
    {
        void InterA();
    }

    class A : Inter
    {
        public A()
        {
        }

        public void AA()
        {
            Console.WriteLine("我是基類A的AA()方法\n");
        }

        public virtual void AAA()
        {
            Console.WriteLine("我是基類A的AAA()方法,實現了Virtual\n");
        }

        public void InterA()
        {
            Console.WriteLine("我是基類A,實現了接口Inter\n");
        }

    }

    class B : A
    {
        public B()
        {
        }

        public new void AA()
        {
            Console.WriteLine("我是B類中用new來替換基類的AA()方法,但這不是繼承的多態性\n");
        }

        public override void AAA()
        {
            Console.WriteLine("我是B類中用override來替換基類的AAA()方法,這是繼承的多態性\n");
        }
    }
}