.Net Framework 4/C# 面向对象编程进阶
一、继承
(一)使用继承
子类可以继承父类原有的属性和方法,也可以增加原来父类不具备的属性和方法,或者直接重写父类中的某些方法。
C# 中使用“:”来表示两个类的继承。子类不能访问父类的私有成员,但是可以访问其公有成员,即只要使用 public 声明类成员,就既可以让一个类成员被父类和子类同时访问,也可以被外部的代码访问。
另外,为了解决父类成员的访问问题,C# 还提供了另外一种访问修饰符:protected,它表示受保护成员,只有父类和子类才能访问 protected 成员,外部代码不能访问。
子类不能继承父类中定义的 private 成员。
需要注意以下几点:
- C# 只支持类的单继承,而不支持类的多重继承,即在 C# 中一次只允许继承一个类,不能同时继承多个类;
- 在实现类的继承时,子类的可访问行必须要低于或者等于父类的可访问性,例如父类采用默认的访问权限:private 时,子类在继承的时候,不能采用 public 的访问权限,因为 public 的访问权限高于 private 的访问权限。
(二) base 关键字
如果子类重写了父类的方法,并且想在子类的方法中调用父类原有的方法,C# 提供了 base 关键字。
base 关键字的使用方法与 this 关键字的使用方法类似,this 关键字代表本类对象,base 关键字代表父类对象,使用方法如下:
base.property; //调用父类的属性
base.method(); //调用父类的方法
如果要在子类中使用 base 关键字调用父类的属性或者方法,则父类的属性和方法的可访问性必须定义为 public 或者 protecte,而不能是 private。
另外,使用 base 关键字还可以指定创建子类对象时应调用的父类构造函数。例如有:
public Computer(string name, string num)
{name = name;num = num;
}public Pad(string model, string name, string num):base(name, num)
{model = model;
}
在静态方法中使用 base 关键字是错误的。
(三)继承中的构造函数与析构函数
在进行类的继承时,子类的构造函数会隐式地调用父类的无参构造函数,而且先调用父类的构造函数,再调用子类的构造函数,析构函数的调用与构造函数相反。
需要注意的是,如果父类提供了有参构造函数,在被子类继承时,需要提供无参默认构造函数,这是因为当父类提供有参构造函数时,不会自动提供无参构造函数。
通过 base 关键字,还可以在子类中调用父类的有参构造函数,此时,父类中就可以不用提供无参构造函数,例如有:
public class Father
{public Father(string name, int age){this.name = name;this.age = age;}
}public class Son : Father
{public Son(string name, int age, char gender) : base(name, age){this.gender = gender;}
}
(四)object 类
在 C# 中,所有的类都直接或间接的继承自了 object 类,object 类是所有类的基类。
(五)关键字 new 隐藏父类成员
当子类和父类在声明成员时,如果子类和父类的成员名相同,则会隐藏掉父类的成员方法,子类对象无法调用父类的成员,这时,程序会报警告。因此,可以在子类定义同名成员时,在访问修饰符后面加上 new 关键字,此时就可以完全隐藏掉父类的同名成员。
(六)sealed 修饰符
继承类时,需要使用冒号加类名,当对一个类应用 sealed 修饰符时(也就是密封类),该修饰符会阻止其他类从该类继承。
(七)里氏转换*
里氏转换主要有两个作用:
- 子类可以赋值给父类,也就是说,如果有一个地方需要一个父类作为参数,我们可以给一个子类代替;
- 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。
例如有:
public class Father
{public void text01(){}
}public class Son : Father
{public void text02(){