读书笔记_C#技术内幕_第八章(设计面向对象的程序)
2008-08-21 01:14
375 查看
继承性:
它是关于一个类(派生类)怎样从另一个类(基类)中共享的特性和行为的术语
派生类继承标记为protected或更高的访问级别的每一个基类成员。
抽象类永远不能实例化。因为抽象类的成员都是没有实现的。抽象类的好处是:它位于类层次结构的顶端,它们建立了代码的结构和意义,使得程序框架更加容易建立。
可以从派生类调用基类的构造函数。
abstract public class A
{
private int i;
public A(int i)
{
this.i = i;
}
}
public class B : A
{
public B(int i) : base(i)
{
}
}
当类没有显式的构造函数时,系统就会分配一个默认的构造函数。该默认的构造函数就会自动地调用默认的或无参数的基构造函数。下面是一个自动生成默认构造函数的例子,这种情况也会出现在前面的例子中:
public B() : A()
{
}
隐藏基类成员:
有时派生类成员与相应的基类成员有相同的名称。在这种情况下,就称为派生类成员“隐藏”了基类成员。当发生隐藏时,派生类成员就屏蔽了基类成员的功能。派生类的用户不能看到隐藏的成员,他们只能看到派生类的成员。
虽然基类成员可以被隐藏,但是派生类仍然能够访问它。派生类通过base标示符来访问其基类成员。
sealed类:
sealed类是不能从中派生的类。要防止其他类从一个类继承,就使用sealed类。
把一个类变成sealed后就可以避免与虚拟方法相关联的系统总开销。编译器就能完成某种程度的优化。
另一个原因是出于安全性的考虑。类变成sealed类之后就完全避免了由派生类引起崩溃的可能性。
多态性:
abstract public class A
{
public virtual string MyString()
{
return “This is A”;
}
}
public class B : A
{
public new string MyString()
{
return “This is B”;
}
}
public class C : A
{
public override string MyString()
{
return “This is C”;
}
}
如果使用下面的代码
A[] AA = new A[2];
A[0] = new B;
A[1] = new C;
foreach (A a in AA)
{
MessageBox.Show(a.MyString());
}
结果将是:
This is A
This is C
多态同样也可以被用于特性和索引器中。
它是关于一个类(派生类)怎样从另一个类(基类)中共享的特性和行为的术语
派生类继承标记为protected或更高的访问级别的每一个基类成员。
抽象类永远不能实例化。因为抽象类的成员都是没有实现的。抽象类的好处是:它位于类层次结构的顶端,它们建立了代码的结构和意义,使得程序框架更加容易建立。
可以从派生类调用基类的构造函数。
abstract public class A
{
private int i;
public A(int i)
{
this.i = i;
}
}
public class B : A
{
public B(int i) : base(i)
{
}
}
当类没有显式的构造函数时,系统就会分配一个默认的构造函数。该默认的构造函数就会自动地调用默认的或无参数的基构造函数。下面是一个自动生成默认构造函数的例子,这种情况也会出现在前面的例子中:
public B() : A()
{
}
隐藏基类成员:
有时派生类成员与相应的基类成员有相同的名称。在这种情况下,就称为派生类成员“隐藏”了基类成员。当发生隐藏时,派生类成员就屏蔽了基类成员的功能。派生类的用户不能看到隐藏的成员,他们只能看到派生类的成员。
虽然基类成员可以被隐藏,但是派生类仍然能够访问它。派生类通过base标示符来访问其基类成员。
sealed类:
sealed类是不能从中派生的类。要防止其他类从一个类继承,就使用sealed类。
把一个类变成sealed后就可以避免与虚拟方法相关联的系统总开销。编译器就能完成某种程度的优化。
另一个原因是出于安全性的考虑。类变成sealed类之后就完全避免了由派生类引起崩溃的可能性。
多态性:
abstract public class A
{
public virtual string MyString()
{
return “This is A”;
}
}
public class B : A
{
public new string MyString()
{
return “This is B”;
}
}
public class C : A
{
public override string MyString()
{
return “This is C”;
}
}
如果使用下面的代码
A[] AA = new A[2];
A[0] = new B;
A[1] = new C;
foreach (A a in AA)
{
MessageBox.Show(a.MyString());
}
结果将是:
This is A
This is C
多态同样也可以被用于特性和索引器中。
相关文章推荐
- 读书笔记_C#技术内幕_第二十七章(属性)
- 读书笔记_C#技术内幕_第十二章(使用命名空间组织代码)
- 读书笔记_C#技术内幕_第二章
- 读书笔记_C#技术内幕_第九章(重载类成员和操作符)
- 读书笔记_C#技术内幕_第十三章(创建结构)
- 读书笔记_C#技术内幕_第十五章(执行转换)
- 读书笔记_C#技术内幕_第二十八章(反射)
- 读书笔记_C#技术内幕_第十章(处理异常和错误)
- 读书笔记_C#技术内幕_第十四章(实现接口)
- PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则
- 读书笔记_C#技术内幕_第十七章(文件的输入/输出和串行化)
- 读书笔记_C#技术内幕_第三十章(不安全代码和平台调用)
- 读书笔记_C#技术内幕_第三章(C#表达式)
- 关于Visual C#.NET 2008 程序设计案例集锦 (计算机实用技术案例系列)的读后感
- 读书笔记_C#技术内幕_第二十三章(多线程)
- 读书笔记_C#技术内幕_第二十九章(本地化和资源)
- 读书笔记_C#技术内幕_第六章(对象和组件概念)
- 读书笔记(七)--Struts技术内幕-深入解析Struts架构设计与实现原理
- 读书笔记_C#技术内幕_第二十五章(字符串操作)(String类)
- 读书笔记_C#技术内幕_剩余章节