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