第七周总结
抽象类
当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。
抽象成员是被设计来被覆写的函数成员,抽象成员有以下特征:
1.它被用abstract修饰符标记。
2.它没有实现代码块。抽象成员的代码块用分号表示。
例如,下面取自一个类定义的代码声明了两个抽象成员:一个名称为PrintStuff的抽象方法和一个名称为MyProperty的抽象属性。注意在实现块位置的分号。
3.抽象成员只可以在抽象类中声明,一共有4个类型的成员可以声明为抽象的:
方法、属性、事件、索引。
4.关于抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符附加到abstract修饰符。
5.就像虚方法,派生类中抽象成员的实现必须指定override修饰符。
抽象类就是被设计来被继承的。抽象类只能被用作其他类的基类。
抽象类不能被实例化。
抽象类使用abstract修饰符声明。
抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带实现的成员的任意组合。(也可以不包含抽象成员,但是,类中存在了抽象成员,那么该类就必须被声明为抽象类)
抽象类自己可以派生自另一个抽象类。
任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类。
− 接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。在定义接口时,需要使用interface关键字来声明。
声明接口的重要事项:
1.接口声明不包含数据成员。
2.接口声明只能包含如下类型的静态成员函数的声明:
方法、属性、事件、索引
3.这些函数成员的声明不能包含任何实现代码,而在每一个成员声明的主体后必须使用分号。
4.按照惯例,接口名称必须从大写的I开始(比如ISaveable)。
5.和类以及结构一样,接口声明还可以分隔成分部接口声明。
接口的访问性和接口成员的访问性之间有一些重要区别。
1.接口声明可以有任何的访问修饰符public、protected、internal或private。
2.然而,接口的成员是隐式public的,不允许有任何访问修饰符,包括public。
实现接口
只有类和结构才能实现接口。要实现接口,类或结构必须:
在基类列表中包括接口名称。
为每一个接口的成员提供实现。
接口的实现如下:
//定义Animal接口
interface Animal
{
void Breathe();
void Run();
}
//Dog类实现Animal接口
class Dog : Animal
{
//实现breathe()方法
public void Breathe()
{
Console.WriteLine("狗在呼吸");
}
//实现run()方法
public void Run()
{
Console.WriteLine("狗在跑");
}
}
//定义测试类
class Program17
{
static void Main(string[] args)
{
Dog dog = new Dog(); //创建Dog类的实例对象
dog.Breathe(); //创建Dog类的Breathe()方法
dog.Run(); //调用Dog类的Run()方法
Console.ReadKey();
}
}
关于实现接口,需要了解的重要事项如下:
如果类实现了接口,它必须实现接口的所有成员。
如果类从基类继承并实现接口,基类列表中的基类名称必须放在任何接口之前,如下所示。
接口是引用类型
接口不仅仅是类或结构要实现的成员列表,它是一个引用类型。
我们不能直接通过类对象的成员访问接口,然而我们可以通过把类对象引用强调转换为接口类型来获取指向接口的引用,一旦有了接口的引用,我们就可以使用减号来调用接口的方法。
例如,如下代码给出了一个从类对象引用获取接口引用的示例