相关文章推荐
霸气的猴子  ·  OpenAPI 规范摘要 - 简书·  2 年前    · 

这一段时间一直在看C#视频,在视频遇到很多陌生的概念,看起来很相似,有些东西很不分清,所以对这些相似的概念总结一下,帮助我们更好的学习。

何为重写?
重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或 override标注的,不能重写非虚方法或静态方法。
Override是在继承的时候,如果你写的函数与要继承的函数函数特征(函数特征包括函数名,参数的类型和个数)相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类的函数了,它被覆盖掉了。
用关键字virtual修饰的方法,叫虚方法。虚方法是多态的一种体现。相应的没有用virtual修饰的方法,叫实方法。可以在子类中用override声明同名的方法,这个叫“重写”。“重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。重写是重写基类的方法,把父类中的方法变成我们更需要的。 重写会改变父类中的方法功能。

<span style="font-family:KaiTi_GB2312;">namespace 重写
    class Program
        static void Main(string[] args)
            A1 a1 = new A1();
            Console.WriteLine(a1.GetName());       //输出内容为“贾文静”
            A2 a2 = new A2();
            Console.WriteLine(a2.GetName());      //输出内容为“jiawenjing”
            //该例子注意和下面的例子进行对比
            A1 a3 = new A2();
            Console.WriteLine(a3.GetName());      //输出内容为“jiawenjing”
    public class A1
        public virtual string GetName()
            return "贾文静";
    public class A2 : A1
        public override string GetName()
            return "jiawenjing";
}</span>
何为覆盖?
覆盖(new)指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。在子类中用new 关键字修饰,定义的与父类中同名的方法。覆盖不会改变父类方法的功能。
<span style="font-family:KaiTi_GB2312;">namespace 覆盖
    class Program
        static void Main(string[] args)
            B1 b1 = new B1();
            Console.WriteLine(b1.GetName());    //输出内容为“贾文静”
            B2 b2 = new B2();
            Console.WriteLine(b2.GetName());    //输出内容为“jiawenjing”
            //下半部分内容与上半部分进行对比
            B1 b3 = new B2();
            Console.WriteLine(b3.GetName());    //输出内容为“贾文静”
    public class B1
        public string GetName()
            return "贾文静";
    public class B2 : B1
        public new string GetName()
            return "jiawenjing";
}</span>
重写VS覆盖
1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改)。
2:当用子类创建父类的时候,如 A1 a3 = new A2(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。
3:虚方法、实方法都可以被覆盖(new),抽象方法,接口不可以。
4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。
5:重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。

重载
overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字。返回值可能不同,可能相同。
<span style="font-family:KaiTi_GB2312;"> public void fun()
  	Console.WriteLine("贾文静");
  public void fun(int i)
        Console.WriteLine("贾文静");
  }</span>

    感觉这些概念性的东西,长的差不多,很是相似,而且感觉他们之间的关系有种剪不断理还乱。这三个概念光纸上谈兵还是没有多大价值的,还是需要我们不断的去实践,利用例子中发现不同,进而有更加深入的理解。不管怎么样,查找一些资料,还是能更加深入的了解一次。总结就是对知识的汇总,所以利用总结提升自己!

    本人纯属菜鸟一只,文章之中有不对的地方,还请大家及时指出,不胜感激!

这一段时间一直在看C#视频,在视频遇到很多陌生的概念,看起来很相似,有些东西很不分清,所以对这些相似的概念总结一下,帮助我们更好的学习。重写何为重写?“重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。重写是重写基类的方法,把父类中的方法变成我们更需要的。在基类的方法中必须要有virtual修饰符(用virtual修饰的方法叫虚方法),而在之类的方法中必须要有overr 域:一个代表和某对象或类相关的变量的成员 字段:和属性相同,是用来存储对象的值,可以直接访问数据且不能对数据添加任何限制,但是属性不能且可以对数据添加访问限制。一个在类或结构的定义中声明的变量。可以被这个类或者结构的所有成员函数(方法、构造函数)使用,可以是值类型或引用类型,主要有实例字段和静态字段。区别于局部变量在于局部变量只能被给定的函数或代码块使用 属性:一种用于访问对象或类的特性的成员。属性的访问器是一种使属性可以像公共数据成员一样被使用的特殊方法(get/set方法)。属性结合了字段和方法的多个方面,对于对象的用户,它显示为字段;对于类的实现者,它是一个或两个代码块(用于表示get/set访问器)。写类的时候使用System.Serializable属性以便使类的成员可以序列化 方法:是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类相关联的动作,它是类的外部界面,对于那些私有的字段来说,外部界面实现对它们的操作一般只能通过方法来实现。方法在类或结构中声明,声明时需要制定访问级别、返回值、方法名称及方法参数。一个方法的签名由它的名称以及它的形参的个数、修饰符和类型组成。方法的签名是方法的唯一标识(同一个类中的区别标识)。 方法的重载:是指方法名相同,但参数类型、个数或顺序不同的方法,与返回值无关(同一类或子类之间) 方法的重写:子类对父类方法的重新实现(方法头相同,方法体即代码块不同) 事件:是使得对像和类提供通知的成员。一个类通过提供事件声明来定义一个事件,这看起来与域和事件声明相当类似,但是有一个event关键字。这个声明的类型必须是delegate类型。如下例子: public delegate void EventHandler(object sender, Event e); public class Button { public event EventHandler Click; public void Reset() { Click = null; } } 索引:是使得对象可以像数组一样被索引的成员 结构:一种值类型,几个数据组成的数据结构。向方法传递结构时,是通过传值方式传递的,结构实例化可以不用new,结构可以声明构造函数,但必须带参数,且声明的构造函数是用来对成员初始化的,必须包含每个字段。结构不能从另一个结构或类继承而来,但可以实现接口,结构中不能初始化实例。结构存储在栈中且只用来表示小的数据结构,类存储在托管堆中 类:是一种数据结构,是具有相同或相似结构、操作和约束规则的对象组成的集合。算法和数据结构的集合(对象),具有封装、继承、多态等特点。父类—基类、子类—派生类。类的多态是指不同的类进行同一操作可以有不同的行为。类是相同对象的集合,并为这些对象定义了编程语言上的属性和方法。类修饰符:new在类声明时使用,public公共的,访问不受限,protected只能从其所在类和所在类的子类中进行访问,internal只有其所在类才能进行访问,private私有的,abstract抽象类,不能实例化,sealed密封类,不能被继承 虚拟成员:声明为virtual的类成员 析构函数:以类名+~来命名的,不能有参数,不能有任何修饰符而且不能被调用。当某个类的实例被认为不再有效并符合析构条件时,.NET Framework类库的垃圾回收功能就会调用该类的析构函数实现垃圾回收,一个类只能有一个析构函数。一般准则是,除非有迫不得已的原因,不要使用析构函数,而应把清楚操作交给运行时完成 接口:声明的所有成员隐式的为public和abstract。在命名空间中声明的接口可以被授予public或internal访问类型。嵌套的接口可以被授予public、protected、internal、protected internal或private访问类型。默认为internal.接口的成员隐式的被声明为public和abstract访问类型且没有实现没有修饰符 密封类:密封类不能作为基类被继承,但可以继承别的类或接口,密封类中不能声明受保护的成员或虚成员,密封类不能声明为抽象的,声明密封类用sealed.密封方法只能用于对基类的虚方法进行实现,声明密封方法时同时使用sealed和override且必须通过重写基类中的虚方法来实现 名称空间:类似java中的包 访问修饰符:private、public、protected、internal:局部的 readonly:只读修饰符 new(新的)、static(静态的)、virtual(虚拟的)、override()、sealed(密封的)、abstranct(抽象的)、extern(外面的) 派生类调用基类的方法可以使用base关键字,如base.Method();
1.方法的重载一般发生在类内部,同样的方法名,有不同的参数与返回类型, 2.方法的重写发生在子类对于父类抽象方法/虚方法的重写,重写的方法都有前缀override,父类一旦包含抽象方法,必然为抽象类,包含虚方法可以为普通类,当然静态类中也可以有有普通的方法.方法的重写一般会碰到实例化调用方法的问题. 例如:当子类Son重写(override)了父类的hit()方法时 Parent p=ne...
C#中的override和new都是用来实现方法重写的关键字,但它们的作用有所不同。 override关键字用于子类中重写父类中已有的虚方法,实现多态性。重写的方法必须与父类中的方法具有相同的名称、返回类型和参数列表。在运行时,调用该方法时会根据对象的实际类型来确定调用哪个方法。 new关键字用于在子类中定义一个与父类中同名的新方法,该方法与父类中的方法没有任何关系。在运行时,调用该方法时会根据引用类型来确定调用哪个方法。 因此,override关键字实现了方法的多态性,而new关键字则是在子类中定义了一个新的方法。
com.netflix.client.ClientException: Load balancer does not have available server for client xxxx 69859