抽象クラスインタフェースabstract virtualとか混同しないで

13899 ワード

△最近、初心者を連れて入門するのは大変です.
インタフェースと抽象クラスはすべてクラスの抽象にすぎない.これは彼らの本質であり、人々の思考角度が異なるだけで、行為契約上の抽象(インタフェース)に偏っている.自然の繁殖関係(抽象クラス)に似ている.
直接コード:
class    

    {

        public static void Main(string[] args)

        {

            ChinesePerson c = new ChinesePerson("xx", 23);

            c.Run();

            c.Speak();

            Console.WriteLine(c.Name);

            Console.WriteLine(c.Age);

            Console.WriteLine(c.Hobby);

            Console.WriteLine("--------");

            c.fight();

            JiangSuPerson j = new JiangSuPerson();

            j.Name = "xiaomao";

            j.Age = 24;

            j.Run();

            j.Speak();

            j.fight();

            j.sing();

            Console.WriteLine(j.Name);

            Console.WriteLine(j.Age);

            Console.WriteLine(j.Hobby);

            Console.WriteLine("----------");

            HenanPerson h = new HenanPerson();

            h.Name = "linyi";

            h.Speak();

            h.fight();

            h.sing();

            Console.ReadKey();

        }

    }



    public interface IRun

    {

        void Run();

    }



  public abstract class Person : IRun

    {

        private string name;

        private int age;

        public string Name

        {

            get { return name; }

            set { name = value; }

        }

        public int Age

        {

            get { return age; }

            set { age = value; }

        }

        public abstract string Hobby { get; set; }

        public Person(string name, int age)

        {

            this.Name = name;

            this.Age = age;

        }

        public Person()

        { }

        public abstract void Speak();

        public void Run()

        {

            Console.WriteLine("Running ~~");

        }

        //            abstract  virtual   ,

        //    ,abstract      , virtual                ,    virtual     。

        public virtual void fight()

        {

            Console.WriteLine("fighting");

        }

    }

    public class ChinesePerson : Person

    {



        public ChinesePerson(string name, int age)

            : base(name, age)

        {

            this.Name = name;

            this.Age = age;

        }

        public ChinesePerson()

        {

        }

        public override void Speak()

        {

            Console.WriteLine("      ");

        }



        public override string Hobby

        {

            get

            {

                return "shopping";

            }

            set

            {

            }

        }

        public override void fight()

        {

            base.fight();

            Console.WriteLine("chinese gongfu fighting");

        }

        public virtual void sing()

        {

            Console.WriteLine("     ");

        }

    }



 //      ,        

    public class JiangSuPerson : ChinesePerson

    {



    }

    public class HenanPerson : ChinesePerson

    {

        public override void Speak()

        {

            Console.WriteLine("        ");

        }

        public override void sing()

        {

            Console.WriteLine("      ");

        }

    }

 
まとめてみます:抽象クラスとインタフェースはすべてクラスの抽象で、インタフェースは更に行為の方面から抽象に関心を持って、文法の上でインタフェースの内容はすべて実現していない必要があって、完全に後ろのクラスを待って実現しますこの点で、抽象クラスは1つの完全に実現していないクラスのようで、彼はすべての普通のクラスのように、フィールド、属性、および方法を持つことができますと思って、これらはすべて具体的な実装体を持つことができるが、このようにすれば、彼と普通のクラスの違いはnewインスタンス化できないことにあるだけで、彼の本当の違いはabstract修飾の部分があるべきで、この部分は具体的に実装されていないので、後の実装クラスによって具体的に実現しなければならない.virtualキーワードはもともとここの討論の範疇に属するべきではなくて、彼の修飾の方法は普通の方法とほとんど同じで、すべて方法体を持っていて、しかしvirtualに修飾された布団類に書き換えることができます.
例を挙げてmvcのコントローラモジュールをシミュレートします
 //     MVC            

    class     

    {

        public static void Main(string[] args)

        {

            IController ic;

            ic = new HomeController();

            ic.Execute();

            Console.ReadKey();

        }

    }



    public interface IController

    {

        void Execute();

    }



    public abstract class ControllerBase : IController

    {

        //

        public virtual void Execute()

        {

            Console.WriteLine("doing some unimporting things");

            ExecuteCore();

        }

        //         

        public abstract void ExecuteCore();

    }

    public abstract class Controller : ControllerBase

    {

        public override void ExecuteCore()

        {

            Console.WriteLine("doing some importing things");

        }

        

        //public override void Execute()

        //{

        //    Console.WriteLine("doing the whole things");

        //}

    }

    public class HomeController : Controller

    {



    }