C# 基础系列继承一(override和overload)

  在面向对象中,继承是三大特性必不可少的。继承貌似没有什么好说的,大家都懂,不就是儿子可以拥有父亲的属性和方法吗~~~

是的~继承就是让儿子拥有父亲的属性和方法。在C#中,只能单继承类和多继续接口。这点我也不想再废话。有兴趣可以找下 接口注入

很多面试的时候,一般我们会遇到这样两个问题:

1.抽象类和接口,你是怎么选择?

  这个仁者见仁智者见智。我也不好说,我必须喜欢优先选择接口。

2.override和overload的区别?

   我这篇重点阐述这点,在开始前,先列举出关键字: virtualabstract,override(overload没有关键字) 

     abstract修饰类为 抽象类,不能被事例化。 修饰方法的时候,为抽象方法(类必须是抽象类),必须被override。

     virtual只能修饰方法,声明为 虚方法,你想实现就实现,不实现也可以。

   override 在msdn的解释    

override 方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的基方法必须与 override 方法具有相同的签名。 有关继承的信息,请参见继承(C# 编程指南)。

不能重写非虚方法或静态方法。 重写的基方法必须是 virtual、abstract 或 override 的。

override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的访问级别修饰符。

您不能使用 new、static 或 virtual 修饰符来修改 override 方法。

    从msdn中,我们很明显的得到几个结论:

      1.父类中有abstract,那么子类同名方法必定有override。

      2.若父类中有 virtual方法,子类同名方法不一定是override,可能是overload。

      3.override必定有父子类关系。可以用青出于蓝而胜于蓝吧。儿子超越了父亲。

overload 在msdn没有这个关键字,不过他应该说是类的三大特性中的多态。(如果非要说有关键字,我想应该是new ,很多时候,我们都可以省却。这个说法很不严谨的哦) 在面向对象中一定提到运算符operator,这个就是overload的一个例子。只不过这个比较特殊,他必须是static方法。而且就不能还不能是我上面说的new 。所以说这个说法很不严谨。

重载overload 是一个类中多态性的一种表现。

子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

这几话删除的时候没注意,没有把他删掉,谢谢3# madfrag的提醒

如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(overload )。 overload 的方法是可以改变返回值的类型。

  

  这个说法是我在java中看到不过也 完全适用于 C#。

  现在加删除线的内容,是有问题的。为此我开了新的一篇---继承二

  随便扩展下吧。正是这个运算符重载,才让很多朋友认为string是值类型,不是引用类型。其实他是引用类型。他只不过是重载了运算符而已,让他看起来是值类型。

   

附上一个小例子包含了我上面说的内容了~

    public abstract class Ba
    {
        public virtual void Test() { }

        public virtual int Property { get; set; }

        public abstract string Nature { get; set; }

        
    }

    public class Sun : Ba
    {
        protected void Test()
        {

        }

        public override int Property
        {
            get
            {
                return base.Property;
            }
            set
            {
                base.Property = value;
            }
        }

        public override string Nature
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public static Sun operator +(Sun b1, Sun b2)
        {
            return null;
        }
    }

  

原文地址:https://www.cnblogs.com/qionghua/p/2605812.html