看视频学编程之继承

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

继承

 
申明一个类是从另一个类继承的,语法:
class DerivedClass : BaseClass
{
  ……
}
//  私有的内容无法继承
//  构造函数无法继承,但在派生类中可以调用基类的构造函数
派生类(DerivedClass)将从基类(BaseClass)继承,基类中的方法会成为派生类的一部分;
C#中,一个类最多只允许从一个其他的类派生;不允许从两个或者更多的类派生,可以从派生类中
派生出更深一级的派生类。
System.Object类是所有类的根,所有类都隐式派生自System.Object类,C#编译器会这样重写这样的:
class Person :System.Object
{
  ……
}
System.Object类中所有的方法都会沿着继承链,向下传递给Person派生出的类。
 
调用基类构造函数
 
除了继承而来的方法,派生类还自动包含来自基类的所有字段,这些字段通常需要初始化,
派生类的构造函数在执行初始化时,最好调用一下它的基类的构造函数;
class Person
{
  public Person(string name)  {……}
}
class Chinese :Person
{
  public Chinese(string name): base(name) {……}
}
如果不在派生类构造函数中显示调用一个基类的构造函数,编译器会自动插入对基类的默认构造函数的一个调用:
如果基类没有一个public的默认构造函数,这种情况下,忘记调用正确的基类构造函数,会造成编译时错误。
 
类的赋值

可以把一种类型的对象赋给继承层次结构中较高位置的一个类的变量——派生可以直接赋给基

Chinese c1 = new Chinese("中国人");
Person p1 = c1;
不能直接把基赋给派生,要先用as或者is检查;或者通过强制转换来进行。
Chinese c1 = new Chinese("中国人");
Person p1 =  c1;
Chinese c2 = p1 as Chinese;                  // 如果p1不是Chinese会返回null
 
申明new 方法
 
一个基类和它的一个派生类申明了两个具有相同签名的方法,那么在编译时就会显示一条警告
派生类中的方法会隐藏基类中具有相同签名的方法——  方法的签名由方法名、参数数量、参数类型决定
class Person
{
  ……
  public void Sayhello()  {……}
}
class Chinese :Person
{
  ……
  new public void SayHello() {……}
}
用new关键字来关闭警告。
 
声明virtual方法、override方法
 
设计被重写的方法为virtual方法;重写(override)这个方法目的是:提供同一个方法的不同实现,
这些方法是互相关联的,它们完成相同的任务,只是不同的类会以不同的方式完成。
上面的用new隐藏方法:将方法替换成另一个方法,方法通常是不互相关联的,而且可能执行完全不同的任务。
class Person
{
  ……
  public virtual void Sayhello()  {……}
}
class Chinese :Person
{
  ……
  public override void SayHello() {……}
}
一个方法的新实现可以调用方法在基类中的原始实现,用base关键字来实现:
class Chinese : Person
{
  ……
  base.SayHello();
}
使用virtual和override声明多态方法时必须遵守下面这些规则:
不允许使用virtual或override声明一个private方法;
两个方法的签名必须完全一致,返回类型也必须相同;
两个方法必须有相同的可访问性;
只能override重写一个virtual方法;
一个override方法将隐式的成为virtual方法,本身可在未来的一个派生类中被override;
不允许显示的将一个override方法声明为virtual方法。
 
protected访问
 
需要允许一个基类的派生类访问基类的部分成员,禁止不属于这个继承层次结构的类访问这些成员;
这种情况下就用protected关键字来标记成员。
如果类A派生自类B,就能访问B的protected成员;B的protected成员对A来说是public的。
如果类A不是派生自类B,就不能访问B的protected成员,B的protected成员对A来说就是private的。
 
 
 
 
原文地址:https://www.cnblogs.com/cctt/p/3142137.html