第十二章:枚举、结构和接口
1.C#中的数据分为值类型和引用类型,枚举和结构属于值类型,接口属于引用类型
枚举:enum
1.定义一组可以 赋值变量 的命名整数常量,用于声明一组命名的常数。
2.枚举最好在命名空间中直接定义,方便命名空间中的类访问他
3.每一个枚举类型的成员都对应着一个整型常数。
4.枚举可以使代码更加清晰,允许使用描述性的名称表示整数值。
5.枚举成员可以使用相同的值。
6.字段的封装一般不写在方法中。
结构:
1.结构通常用来封装一组相关的变量,结构中可以包含函数,常量,字段,方法,属性,运算符,时间和嵌套类型等成员,结构和类共享几乎所有语法,只是受到的限制更多。类是引用类型,结构是值类型。
2.向方法传递结构时,结构是通过传值的方式传递的,而不是通过作为引用传递。
3.结构也需要实例化,其实例化可以不使用new运算符
4.一个结构不能从另一个结构或者类继承,所有结构直接继承于System.ValutType。也不能被继承。
5.结构实际是将多个相关的变量包装成一个整体使用,结构体中的变量可以是相同,部分相同和完全不同的数据类型。
6.结构和类相似,如何选择结构和类:
a.实现一个主要用于存储数据的类型时,可以考虑结构。
b.结构变量占用堆栈的空间,而堆栈空间有限,对于有大量逻辑的对象则创建结构。
c.结构用来表示如点、矩形和颜色这样的轻量对象,大多数情况下,该类型只是一些数据时,用结构
d.表现抽象和多级别对象层次时,类是最好的选择。
接口 interface
1.类只支持单继承,当需要多继承时,就需要用到接口。接口是一种用来定义程序的协议,用于描述可以属于任何类型或结构的一组相关行为,接口只能由方法、属性、事件和索引器构成,不能包含字段。接口可以实现多继承。
2.类和结构可以像继承基类或结构一样从接口继承,且可以继承多个接口。当类和结构继承接口,它继承成员定义,但是不继承实现。,如果要实现接口成员,类中 的公共成员必须是公共的,非静态的,并且与接口成员有着相同的名称和签名。
3.接口可以继承其他接口,类可以通过继承的基类或接口多次继承某个接口。
4.接口类似于抽象基类,继承接口的任何非抽象类型都必须实现接口的所有成员。不能够直接实例化接口。接口不包含方法的实现。类和接口可以从多个接口继承,接口自身可从多个接口继承。
5.get访问器声明该属性是可读的,set访问器声明该属性是可写的。
6.使用接口的意义在于定义了一系列的标准,然后由具体的类来实现。接口通过类继承来实现。
7.类实现一个接口,一般用隐式接口,当类实现多个接口,并且接口中包含相同的方法签名时,使用显示接口实现。
8.隐式接口实现中,类和接口都可以访问接口中的方法,显示接口中只能通过接口访问。
9.接口中只能包含未实现的属性,方法,时间和索引器且他们都是没有实现的,不允许包含任何字段,任何构造函数和析构函数。
10.不允许接口中嵌套任何类型。如enum、struct、class、interface等
11.接口不允许继承类和结构且接口不能实例化。
12.虽然可以称某个类继承了一个或者多个接口,但更多情况下是说实现了一个或者多个接口。
13.接口成员自动是公开的,因此他们不会包含任何修饰符,成员也不能是静态的。例如,接口中的属性只能声明具有哪个访问器,而不能实现该访问器。
14.继承类时,必须在子类和基类之间用冒号分隔,若继承多个接口,则在继承的每个接口之间用逗号分隔。
15.接口和抽象类相似,如他们都不能被实例化,都包含没有实现的方法,子类都必须实现未实现的方法,都可以包含属性和方法等。但存在许多不同
a.抽象类中可以定义成员的实现,但是接口中不可以。
b.抽象类中的成员可以使私有的(其不为抽象的)、受保护的,内部的,但接口中的成员必须是公共的。
16.类显式实现接口,若类实现两个或者两个以上的接口,并且这两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为他们的实现。但若两个接口成员实现的功能不同,则可能导致其中一个接口的实现不正确或两个接口的实现都不正确,这时就可以显式的实现接口成员,即创建一个仅通过该接口调用并且特定于该接口的类成员。