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 ;
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值