在面向对象中,继承是三大特性必不可少的。继承貌似没有什么好说的,大家都懂,不就是儿子可以拥有父亲的属性和方法吗~~~
是的~继承就是让儿子拥有父亲的属性和方法。在C#中,只能单继承类和多继续接口。这点我也不想再废话。有兴趣可以找下 接口注入
很多面试的时候,一般我们会遇到这样两个问题:
1.抽象类和接口,你是怎么选择?
这个仁者见仁智者见智。我也不好说,我必须喜欢优先选择接口。
2.override和overload的区别?
我这篇重点阐述这点,在开始前,先列举出关键字: virtual、abstract,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; } }