天天看點

類重寫

01.override

類重寫
class Program
    {
        static void Main(string[] args)
        {
            Controller controller=new SubClass();
            ReadKey();
        }
    }

    class Controller
    {
        public Controller()
        {
            Run();
        }
        public void Start()
        {
            Console.WriteLine("Start");
        }

        private void Run()
        {
            Start();
            InternalRun();
            Stop();
        }

        public void Stop()
        {
            Console.WriteLine("Stop");
        }

        protected virtual void InternalRun()
        {
            Console.WriteLine("ControllerInternalRun");
        }

    }


    class SubClass:Controller
    {
        protected override void InternalRun()
        {
            Console.WriteLine("SubClassInternalRun");
        }
    }      
類重寫

02.new 加上new關鍵字的屬性或函數将對本類和繼承類隐藏基類的同名屬性或函數new和overrid的差別

01.當子類構造父類時,調用的是父類的構造方法

類重寫
class Program
    {
        static void Main(string[] args)
        {
            A a =new B(); //A隻認識類B中繼承于類A的Method函數,也就是它本身的方法,對于B類中的Method它不可見
            a.Method(); //this Method in Class A! 調用了類B中繼承于A的Method函數
            ReadKey();
        }
    }

    public class A
    {
        public virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public new void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }      
類重寫

02.override關鍵字表示重寫,對于加上override關鍵字的屬性或函數将完全覆寫基類的同名虛屬性或虛函數

使基類的虛屬性和虛函數在整個繼承鍊中都不可見(在子類中用base關鍵字調用除外)

類重寫
//B的Method函數完全覆寫基類的同名虛函數Method,使整個繼承鍊中看見的Method函數都是B中的Method,是以就算是以A角度來看B,A看到的Method函數也是           //B中的Method,因為A中的Method完全被B的覆寫了
 class Program
    {
        static void Main(string[] args)
        {
            A a =new B();
            a.Method(); //this Method in Class B! 調用了類B的Method函數

            ReadKey();
        }
    }

    public class A
    {
        public virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }      

03.如果要在B的對象中調用A的Method函數還是有辦法,就是使用base關鍵字

class Program
    {
        static void Main(string[] args)
        {
            A a =new B();
            a.Method(); ///this Method in Class B this Method in Class B! 調用了類A和B的Method函數

            ReadKey();
        }
    }

    public class A
    {
        public virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public override void Method()
        {
            base.Method();
            Console.WriteLine("This Method in Class B!");
        }
    }      

04.sealed

類重寫
public class A
    {
        public  virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public sealed override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }

    public class C : B
    {
        
    }      

05.構造器

類重寫
class Program
    {
        static void Main(string[] args)
        {
            A a =new B();
            a.Method();
            ReadKey();
        }
    }

    public class A
    {
        //首先通路的是基類A的構造器
        public A()
        {
            Console.WriteLine("A");
        }
        public  virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public  override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }

       
    }      
類重寫

當基類沒有可以通路的構造器時候

class Program
    {
        static void Main(string[] args)
        {
            A a =new B(2);
            a.Method();
            ReadKey();
        }
    }

    public class A
    {
        private int a;
        public A(int a)
        {
            this.a = a;
        }
        public  virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public B(int a) : base(a)
        {
        }
        public  override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }