c# 基础加强--多态I

来源:互联网 发布:图书借阅软件 编辑:程序博客网 时间:2024/04/20 15:47

一、隐藏基类方法:new

 class MyBase    {        public void Func()        {            Console.WriteLine("俺是父类");        }    } class MySub : MyBase    {        /*         * 子类与父类方法同名的时候,建议加上new标记         * 在使用对象的时候,如果是new的父类对象,没有什么异常         * 如果new的是子类对象,看其当前类型,由当前类型决定调用重名方法时,执行的是父类还是子类的方法         */        public new void Func()        {            Console.WriteLine("我是子类");        }    }


二、重写基类方法 virtual   override

    // 将父类方法标记为virtual,表示可以被重写    // 将子类方法标记为override,表示为重写基类方法    class USBlei    {        public virtual void USB()        {            Console.WriteLine("我是一个USB协议");        }    }    class USB灯:USBlei    {        public override void USB()        {            Console.WriteLine("灯亮了");        }    }    class iPhone : USBlei    {        public override void USB()        {            Console.WriteLine("充电了");        }    }    class Udisk : USBlei    {        public override void USB()        {            Console.WriteLine("传数据");        }    }

隐藏基类 与 重写基类 的前提: 是子类继承父类,且有相同的方法(非重载)
有关new 与 override的区别:new为隐藏基类方法,看实际定义类型来决定调用方法;override 为重写基类方法,调用最新方法。父类方法中没有加 virtual修饰符,则子类不能加 override修饰符对父类方法进行重写。

如:

USBlei usbLight = new USB灯();         

usbLight.USB();
USBlei usbiPhone = new iPhone();

usbiPhone.USB();
USBlei usbDisk = new Udisk();         

usbDisk.USB();
Console.ReadKey();

执行结果为:

灯亮了

充电了

传数据

MyBase  mb = new MySub()

mb.Func();

执行结果为:

俺是父类

MySub sb =new MySub()

sb.Func()

执行结果为:

俺是子类

三、多态的前提:继承 与 里氏转换原则。

四、抽象方法 abstract :不用写方法体,或者根本不知道怎么写方法体;没有方法体,就没有大括号。

       1、抽象方法必须存在于抽象类中,抽象类不能实例化。

        2、抽象方法的定义: 访问修饰符一般是public,不允许private;

                                             方法是可以带参数。public abstract void Func();

        3、子类必须实现父类的所有抽象方法,除非子类也是抽象类;其实现方法为:

               public override void Func()

               {

                        Console.WriteLine("实现了父类的抽象方法");

                }

                 4、class MySub:MyBse光标在此处时,按下shift + alt + f10 再敲回车,自动补全子类实现基类的抽象方法。

五、抽象类:

1、不能实例化;

2、抽象类就是一般类多了几个抽象的成员;

3、定义:

abstract class MyAbs

{

                    public abstract void Func();

                     //凡是与方法有关的都可以作为抽象成员

                     //以下是四种抽象成员

                     //可读可写的抽象属性

                     public abstract string Name      //如果不加abstract ,则为默认属性

                     {

                              get;

                              set;

                      }

                     public abstract string Name   

                     {

                              get;

                      }

                     public abstract string Name

                     {

                              get;

                      }

                     //索引器(带参数的属性)、事件的声明(一个私有的委托变量加上两个方法,类似于字段与属性的关系)

  }

4、子类的实现代码如下:

class MySub : MyAbs    {        public override void Func()        {            Console.WriteLine("实现了抽象方法");        }        public override string Name        {            get;            set;        }        public override string Name1        {            get { return "123"; }        }        public override string Name2        {            set { this.Name = value; }        }    }