类和继承
目录
类继承
派生类不能删除它所继承的任何成员
访问继承的成员
所有类都派生自 object 类
类 object 是唯一的非派生类,因为它是继承层次结构的基础
没有基类规格说明的类隐式地直接派生自类 object
屏蔽基类的成员
虽然派生类不能删除它继承的任何成员,但是可以用于基类名称相同的成员来屏蔽基类成员,这是继承的主要功能之一,非常实用
震惊,方法可以用 new 屏蔽掉
基类访问
使用基类的引用
派生类的实例由基类的实例加上派生类新增的成员组成。派生类的引用指向整个类对象,包括基类部分
虚方法和覆写方法
覆写标记为 override 的方法
当通过基类(不只是最底层的基类,只要被别的类继承了就都可以是基类)调用时,调用被沿着继承层次向上传递,直到最后一层被标记为 override 标记的方法
使用 new 声明
此时向上调用时在MyDerivedClass 的方法中停下了
覆盖其他成员类型
构造函数的执行
创建一个实例过程中完成的第一件事是初始化对象的所有实例成员。在此之后,调用基类的构造函数,然后才执行该类自己的构造函数体
构造函数初始化语句
在基类参数列表中的参数必须在类型和顺序方面与已定的基类构造函数的参数列表相匹配
类访问修饰符
类的可访问性有两个级别: public 和 internal
程序集间的继承
C#允许从一个在不同的程序集内定义的基类来派生类
要从不同程序集中定义的基类派生类,必须具备一下条件:
成员访问修饰符
访问成员的区域
公有类的公有成员对同一程序集或其他程序集的所有类可见
private 类成员只能被它自己的类成员访问,不能被其他的类访问,包括继承它的类。但是可以被嵌套在它的类中的类成员访问
protected 访问级别如同 private 访问级别,但是它允许派生自该类的类访问该成员。即使程序集外部继承该类的类也能访问该成员
internal 的成员对程序集内部的所有类可见,但对程序集外部的类不可见
受保护内部成员的访问性
protected internal 的成员对所有继承该类的类以及所有程序集内部的类可见。这是 protected 和 internal 的并集,不是交集
成员访问修饰符小结
抽象成员
抽象成员是指设计为被覆写的函数成员,抽象成员有一下特征:
抽象成员只可以在抽象类中声明 一共有4个类型的成员可以声明为抽象的:
方法 属性 事件 索引
抽象类
抽象类就是指设计为被继承的类,抽象类只能被用作其他类的基类
不能创建抽象类的实例 抽象类使用abstract 修饰声明
密封类
密封类只能被用作独立的类,不能被用作基类
密封类使用 sealed 修饰符标注
静态类
静态类中所有成员都是静态的,静态类用来存放不受示例数据影响的数据和函数。静态类的一个常见的用途可能就是创建一个包含一组数学方法和值的数学库
类本身必须标记为 static
using System;
using System.Collections.Generic;
using System.Text;
namespace Csharpzuoye
{
static public class MyMath
{
public static float PI = 3.14f;
public static bool IsOdd(int x) { return x % 2 == 1; }
public static int Times2(int x) { return 2 * x; }
}
class Program
{
static void Main()
{
int val = 3;
Console.WriteLine("{0} is odd {1}.", val, MyMath.IsOdd(val));
Console.WriteLine("{0} * 2 = {1}.", val, MyMath.Times2(val));
}
}
}
扩展方法
在迄今为止的内容中,每个方法都和声明它的类关联。扩展方法特性扩展了这个边界,允许编写的方法和声明它的类之外的类关联