C#中的继承
来源:互联网 发布:长沙网络推广营销公司 编辑:程序博客网 时间:2024/04/29 21:15
原文地址:http://www.dingos.cn/index.php?topic=1078.0
有两种继承类型
C#只支持单一继承,不支持多重继承
在C#中,一个类可以基础另一个类。被继承的类称为父类或者基类,继承其他类的类称为子类或派生类。
继承是面向对象编程中一个非常重要的特性。在有继承关系的两个类中,子类不仅具有自己独有的成员,还具有父类的成员。
继承关系在类图中表示为一个箭头,箭头指向的是父类。
继承要符合is-a的关系,即子类是父类。
这是通过以下方式实现的:在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。
}
public class B : A{
public B() { }
}
在上面的示例中,类 B 既是有效的 B,又是有效的 A。访问 B 对象时,可以使用强制转换操作将其转换为 A 对象。强制转换不会更改 B 对象,但您的 B 对象视图将限制为 A 的数据和行为。将 B 强制转换为 A 后,可以将该 A 重新强制转换为 B。并非 A 的所有实例都可强制转换为 B,只有实际上是 B 的实例的那些实例才可以强制转换为 B。如果将类 B 作为 B 类型访问,则可以同时获得类 A 和类 B 的数据和行为。对象可以表示多个类型的能力称为多态性。
注意:
★ 没有“:”,默认父类为Object
★ 只能有一个父类,即单继承
★ 子类继承父类的全部成员
using System;
class CharacterVal{
public int setCharVal(char ch){
char charVal=ch;
}
class StringVal : CharacterVal{
public string strVal;
public int setStrVal(string str){
strVal=str;
}
class Inheritance{
static void Main(){
StringVal object1 = new StringVal();
}
基类访问只能在构造函数、实例方法或实例属性访问器中进行。
从静态方法中使用 base 关键字是错误的。
base 关键字用于从派生类中访问基类的成员:
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i) {
Console.WriteLine("in BaseClass(int i)");
}
}
public class DerivedClass : BaseClass {
public DerivedClass() : base() { }
public DerivedClass(int i) : base(i) { }
}
public virtual void GetInfo(){
Console.WriteLine("Name: {0}", name);
}
}
class Employee : Person {
public string id = "ABC567EFG";
public override void GetInfo() {
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}
在C#中,一个子类继承父类,在编写子类的构造函数时需要注意以下两点:
1. 隐式调用父类构造函数
如果子类的构造函数没有使用base关键字指明调用父类的那个构造函数,则父类必须提供一个默认的无参构造函数。因为子类构造函数在这种情况下会隐式调用父类的默认无参构造函数base()。
2. 显示调用父类的构造函数
如果父类中没有提供默认的无参构造函数,那么子类的构造函数必须明确指明调用的是那个父类的有参构造函数。
注意:子类的无参构造函数调用父类的有参构造函数时,要给参数赋值。
1. 继承的传递性:类可以传递继承即(父类A,子类B继承父类A,子类C继承类B - 即类C直接继承至类B间接基础至类A)。在程序中可以调用父类的方法,也可以是调用父类的父类的方法。
2. 继承的单根性:在C#中明确规定,一个子类不同同时继承多个父类。
3. 密封类:在C#中还有一个特殊的关键字sealed,用它修饰的类是不能被继承的。称为密封类。
Console.WriteLine("First");
}
}
class Second: First {
~Second() {
Console.WriteLine("Second");
}
}
class TestDestructors {
static void Main() {
Second s = new Second ();
}
}
原则上子类对象是可以赋给父类对象的,也可以说子类可以替换父类并且出现在父类能够出现的任何地方。但是反过来,父类对象是不能替换子类的。这种特性称为“里氏替换原则(LSP)”。通俗理解就是,父类的方法都要在子类中实现或重写。
里氏替换原则两个关键技术:
1. is操作符的使用
“is”操作符用于检查对象是否与给定类型兼容。
如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true。
如果已知表达式将始终是 true 或始终是 false,则 is 关键字将导致编译时警告,但是,通常在运行时才计算类型兼容性。
不能重载 is 运算符。
请注意,is 运算符只考虑引用转换、装箱转换和取消装箱转换。不考虑其他转换,如用户定义的转换。
在 is 运算符的左侧不允许使用匿名方法。lambda 表达式属于例外。
2. as操作符的使用
as 运算符用于在兼容的引用类型之间执行转换。
// someObject is a string.
}
- C#中的继承
- C#中的继承应用
- C#中的继承
- C#中的继承
- C#中的继承
- C#中的接口继承
- C#中的继承
- C#中的继承
- C#中的继承
- C#中的继承举例
- C#中的继承
- C#中的继承规则
- C#中的继承(一)
- 浅谈C#中的实现继承
- C#中的继承(一)
- C#中的继承(二)
- c#继承中的函数调用
- C#中的继承、隐藏与重写
- Campus cluster
- JAVA和C#对比
- powerdesigner根据txt建立表
- OpenMAX IL 头文件的定义
- snmptrap
- C#中的继承
- MySQL 字符集与校对规则
- 用了IC卡刷卡水控器有什么好处
- 互动桌
- GridView的模板列中判断控件所在行
- printk()函数的使用 控制台改变显示消息级别
- 单恋的痕迹
- 一卡通
- 如何产生SPQuery 对应的Query 字串?