静态类,抽象类,接口

静态类(static class) VS 普通类(normal class)

1. 静态类不能实例化。

2  静态类不能被继承。

3. 静态类成员(包括属性和方法,下同)必须是静态的。(因为不能实例化,所以无法包含实例成员)

4. 静态类不能作为泛型参数。

5. 只有静态类才能承载扩展方法,换句话说扩展方法的载体必须包含在静态类中

实际上在把静态类编译成IL时,会在它前面添加abstract和sealed两个关键字,分别代表了不能实例化和不能被继承。

但是在实际书写C#代码时,我们程序员不能把一个抽象类(abstract class)定义成密封类(sealed class)。原因会在下面提到。


抽象类(abstract class) VS 普通类(normal class)

1. 抽象类不能被实例化,但可以有构造函数。

2. 抽象类必须被继承通过子类才能实例化。

3. 抽象类可以有抽象成员,也可以没有抽象成员。但如果有抽象成员,则必须是抽象类。(抽象成员就是没有实现的成员)

4. 抽象类的子类可以是抽象类,也可以不是抽象类。如果不是抽象类,则子类必须实现父类的所有抽象成员。如果是抽象类,则子类可以不实现父类的抽象成员。

5. 抽象类不能声明为密封(sealed),因为抽象类必须被继承才能实例化,所以不能继承的抽象类是没有意义的。

6. 抽象成员不能定义为私有(private)和静态(static)


抽象类(abstract class)VS 接口(interface)

其实我们可以把接口看作是特殊的抽象类,这种抽象类包含抽象成员(abstract members).

并且这个抽象类里的所有成员,都不需要程序员去添加修饰符。IL会自动帮我们添加public和abstract修饰符。

接口的实现者必须实现所有的抽象成员,而抽象类的子类则不必要。

 

Note: 静态成员可以存在于普通类,静态类和抽象类中,不能存在于接口中





你可能感兴趣的:(C#笔记,C#)