• new,virtual,override,interface,delegate,eventC#——方法实现总结


    C#——方法实现总结

    本文分两部分来写,第一部分:C#方法实现的理解与问题,第二部分:C#中方法实现的种类。

    第一部分:C#方法实现的理解与问题

    理解:

    1. 使用virtual和override关键字,在基类和派生类中用同样的方法签名实现不同的方法

    2.  使用interface接口,在不同的类中,用相同的方法签名实现不同的方法

    3.  用委托delegate,把不同类中的方法集合在一起,然后一起调用,完成某种综合的功能

    4.  使用事件,完成跟委托一样的功能

    以上四条全都说明了面向对象的多态性。

    问题

    怎么样区分委托和事件?

    我把它们给混淆了,分不清楚。

    第二部分:C#中方法的实现分为以下几种:

    1.最基本的方法声明

    returnType  methodName (parameterList)

    {

    //方法主体

    }

    2.声明new方法

    假如基类和派生类中声明了两个具有相同签名的方法,那么在编译的时候会出现一条警告信息(派生类的方法会屏蔽基类中的方法)

    如果在派生类中使用new关键字来声明与基类有着相同签名的方法,编译时不会出现警告信息,派生类的方法依然会屏蔽基类中的方法,只是编译时不出现警告信息

    Example:

    Class Horse:Mammal

    {

    New public void Talk()

    {

    //方法主体

    }

    }

    3.声明virtual方法

    声明virtual方法的目的:提供同一个方法的不同实现,而这些方法是相互关联的,因为他们旨在完成相同的任务,只是不同的类(不同的类只能时派生类)会有不同的实现。

    用virtual关键字把方法声明为virtual

    Example:

    namespace System

    {

    Class Object

    {

    Public virtual string ToString()

    {

    //方法主

    }

    4.声明override方法

    假如基类将一个方法声明为virtual方法,派生类就可以用override关键字来声明该方法的另一个实现。

    Example:

    Class Horse:Mammal

    {

    Public override string ToString()

    {

    }

    }

    在派生类中一个方法的新的实现可以调用方法在基类中的原始实现,这要用base关键字来实现。

    Example:

    Public override string ToString()

    {

    base.ToString();

    }

    注意:

    使用virtual和override关键字声明多态方法遵守的规则如下:

    A.不允许用virtual和override声明一个private方法,否则出现编译错误

    B.两个方法的的签名必须完全一致,返回类型也必须相同。也就是说他们必须有相同的名称,相同的参数类型,相同的参数数量,以及相同的返回类型。

    C.两个方法必须有相同的可访问性。例如其中一个方法是public,那么另一个必须是public的(方法也可以是protect)

    D.只能是override重写virtual方法,如果基类方法不是virtual,你试图用override重写它,会出现编译错误

    E.假如派生类不用override来声明方法,就不会重写基类方法,它会成为和基类方法完全不相关的另一个方法的实现,该方法只是恰巧与基类方法同名,这样会造成编译时发出警告:该方法会隐藏继承的同名方法。可以用new关键字消除这一警告。

    F.一个override的方法会隐式的成为virtual方法,本身可在未来的派生类中被override,不允许用virtual显式的声明override方法

    5.扩展方法

    扩展方法是在一个静态类中定义的,要扩展的类型必须是方法的第一个参数,而且必须附加一个this关键字。

    扩展方法允许通过附加的静态方法来扩展现有的类型(无论类还是结构),任何语句一旦引用被扩展类型的数据,就能立即使用这些静态方法。

    Example:

    Static class Util

    {

    Public static int Negate(this int i)

    {

    return –i;

    }

    }

    要使用扩展方法,只需要让Util类进入作用域(如有必要,添加using语句,指定Util类所在的命名空间),然后可以简单的使用“.”记号法来引用方法。

    Example:

    Int x=591;

    Console.writeline(“x.Negate{0}”,Util.Negate(x));

    6.Interface 接口

    接口名字以大写字母I开头,同样的方法名字,在不同的类(这个不同的类不是指的派生类)中有不同的实现方法。

    接口只包含方法的名称、返回类型和参数,方法具体的实现接口并不关心。

    (我的理解:接口只是声明方法,不实现方法)

    接口中不允许指定任何访问修饰符(不能限制public 、private、protected)

    Example:

    Interface IComparable

    {

    Int compareTo(object obj)

    }

    要实现一个接口,需要声明一个类或结构,让他们从接口继承,并实现接口指定的所有方法。

    注意:

    实现一个接口必须保证:每个方法都完全匹配与它对应的接口中的方法

    A方法名和返回类型完全匹配

    B所有参数完全匹配(包括ref和out关键字修饰符)

    C使用接口名作为方法名的前缀,这称为显式接口实现,我们平时应多使用显式接口实现

    D用于实现一个接口的所有方法都必须具有public可访问性,假如使用显式接口实现,则不应该为方法添加访问修饰符

    7.委托(delegate)

    委托是指向一个方法的指针,通过指定一个委托名称,就可以通过委托来调用不同类中的方法。

    委托用法:

    A 委托在类中声明,

    B 创建委托实例,

    C 在类的构造器中为委托实例添加其他类的方法

    D 在类中编写方法调用委托实例

    注意:

    在命名空间声明的委托不需要在构造其中添加方法,不需要在类中写方法调用委托,可以直接调用委托

    使用委托的时候,遇到带参数的方法,有两种处理方法:

     A:创造方法适配器实现委托

     B:利用lambda表达式实现委托

    8.事件

       事件是在委托的基础上进行声明的。

       具体做法:

    A:首先在类中声明委托;

    B:利用声明的委托声明事件

    C:订阅事件(为事件添加方法)

    D:引发事件(跟委托相似,把一个事件当方法调用)

    注意:

    事件只能由定义它的类来引发,在类外部引发事件会造成编译错误

    lambda表达式同样适用于事件

  • 相关阅读:
    代码块
    hp g6 2328tx 加装ssd 机械硬盘安装到光驱位置 问题小结
    thinking java
    命令设计模式
    内部类
    模板方法模式
    UIAlertController
    一个基于qml的网络封装库
    qml package 的使用
    一个QMLListView的例子--
  • 原文地址:https://www.cnblogs.com/greenteaone/p/1837585.html
Copyright © 2020-2023  润新知