菜鸟的C#学习之旅——多态的实现途径

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whc888666/article/details/84450839

目录

一、定义

二、虚方法:

三、抽象类与抽象方法:

四、接口实现:

五、总结:


一、定义


多态:在面向对象语言中,接口的多种不同实现方式即为多态

多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现。在C#中可以通过多种途径实现多态性。

二、虚方法:


将父类的方法标记为虚方法,使用关键字virtual,此方法在子类中可以重写(使用关键字override)

1.当某个实例方法声明包括 override 修饰符时,该方法将重写所继承的具有相同签名的虚方法。

2.子类可以重写父类,可以不重写。
(1)重写:当子类重写的时候,显示的就是重写后的内容;

(2)隐藏:当子类不进行重写的时候,显示的就是原来父类中的内容。

3.重写只能重写父类的虚方法,实方法是不可以重写的。

4.虚方法不能用 static 修饰 。

5.虚方法不能用 private 修饰,因为虚方法就是让子类来重写的,如果声明为 private,子类就无法重写,所以不能是私有的 。

6.实例(代码展示)

static void Main(string[] args)
        {
          

            //可以在父类的方法的修饰符后面加 virtual

            //在子类中重写父类的方法,加上一个override;调用父类的方法,但是把父类的方法进行重写了
            //更换了方法里面的内容


            Person p = new Person();
            p.Show();

            Teacher t = new Teacher();
            t.Name = "张三";
            t.Age = 90;
            t.Gender = '男';
            t.Show();

            Console.ReadKey();

        }
    }
    public class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set {_gender = value ;}
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        public virtual void Show()//虚方法----
         {
             Console.WriteLine("我是人别害怕");
         }

        public void Say()
        {
            Console.WriteLine("Hello");
        }

    }
    public class Teacher : Person
    {
        public override  void Show()
        {
            Console.WriteLine("我是老师");
        }

三、抽象类与抽象方法:


如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法

写成抽象方法,子类中的方法仍用关键字override重写。

1.抽象方法使用 abstract 修饰符进行声明,并且只有在同样被声明为 abstract 的类中才允许出现。

2.抽象方法必须在每个非抽象派生类中重写。

3.抽象方法没有方法体。

4.抽象类无法实例化。

5.抽象类中的抽象方法是给子类写的,父类自己用不了。

6.父类是抽象类,子类继承了这个类,必须把抽象类中的抽象方法重写。

7.实例:(代码展示)

 static void Main(string[] args)
        {
            //抽象方法是用abstract修饰;
            //抽象方法没有方法体
            //抽象方法必须在抽象类中
            //抽象类无法实例化
            //抽象类中的抽象方法是给子类写的,它自己用不了
            //父类是抽象类,子类继承了这个类,必须把抽象类中的抽象方法重写

            Chinses china = new Chinses ();
            china .Speak ();
            Console .ReadKey ();
        }
    }
    public abstract  class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        public abstract void Speak();
        
    }
    public class Chinses:Person
    {
        public override void Speak()
        {
            Console.WriteLine("汉语");//重写了父类中的抽象方法
        }

四、接口实现:


接口使用 interface 关键字声明,它与类的声明类似。接口声明默认是 public 的。通常接口命令以 I 字母开头。

1.接口不能直接实例化。

2.接口可以多实现,但是类只能单继承。

3.类定义可以在不同的源文件之间进行拆分 接口则不可以。

4.接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

5.接口可以实现接口。

6.实例:(代码展示)

static void Main(string[] args)
        {
            //这里的IFly既不是父类又不是主类,为什么能New出student?
            //其实原因就在与Student实现了IFly这个接口
            //其实这个也是多态的一种体现形式(非常高级的内容)
            //接口不能直接实例化
            //接口可以多实现,但是类只能单继承
            //类定义可以在不同的源文件之间进行拆分 接口则不可以

            //接口、类、结构都可以从多个接口继承
            //接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员
            //接口可以实现接口

            IFly ifly = new Student();
            ifly.IFly();
            Console.ReadKey();
        }
    }
    public class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set {_gender = value ;}
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        public void Say()
        {
            Console.WriteLine("Hello");
        }
    }

    public class Teacher:Person,IFly //既有继承又有接口的情况
    {
        public void Say()
        {
            Console.WriteLine("我是老师");
        }

        public void IFly()//实现接口,这里的内容不可以省略,既然用就必须实现,不可以空缺
        {
            Console.WriteLine("我会飞");
        }

        void IFly.IFly()//显示实现接口
        {
            Console.WriteLine("我也会飞");
        }
    }

    public class Student:IFly //接口叫实现不叫继承
    {
        public void SayHello()
        {
            Console.WriteLine("我是学生");
        }
        public void IFly()
        {
            Console.WriteLine("我会飞");
        }

五、总结:


当然就我目前水平认识的多态还远远不够,有很多的知识还隐藏在其后,需要我们不断的总结和实践方能见到其真相。本文中

如有不恰当之处,还望指出。本人不甚感激。
 

猜你喜欢

转载自blog.csdn.net/whc888666/article/details/84450839