C#学习笔记—继承和多态
1、可以在派生类型中访问父类的公共成员,但是私有成员只能被定义它的类访问;C#要求一个类只能有一个直接基类。
2、C#提供关键字sealed来防止发生继承,如果将类标记为sealed,编译器将不会允许我们从这个类型派生。
3、C#结构总是隐式密封的,我们永远不可以从结构继承结构,从类继承结构或从结构继承类,结构只能用于建模独立的、用户定义的数据类型。
4、使用base关键字控制基类的创建
5、protected关键字。在基类中定义受保护成员的好处在于:派生类不再需要使用公共方法或属性来间接访问数据了。不能从对象实例中直接访问受保护数据。
6、如果希望构建新类来使用密封类的功能,唯一的办法就是使用包含/委托模型。
7、嵌套类型定义。公共嵌套类型可以被任何人使用,私有嵌套类型只可以被包含类的成员使用,非嵌套类不能使用private关键字来声明
8、多态为子类提供了一种方式,使其可以定义由其基类定义的方法,这种过程叫做方法重写。如果基类希望定义可以由子类重写的方法,就必须用virtual关键字标志方法。如果子类希望改变虚方法的实现细节,就必须使用override关键字。
9、将类定义为抽象类来防止直接实例化。
10、抽象方法只可以定义在抽象类中。
11、可以使用new关键字应用到任何从基类继承的成员类型中(字段、常量、静态方法、属性等),此后仍然可以使用显式强制转换来触发阴影成员在基类中的实现。
12、基类/派生类的转换规则:在.NET平台下,系统中的最高基类是System.Object。因此,所有东西都是object,并且可以照此进行处理,因此,在对象变量中保持任何类型的实力都是合法的;类型之间强制转换的第一条准则就是如果两个类通过“is-a”关系关联,在基类引用中保持派生类总是安全的;第二条规则是:使用C#强制转换操作符进行显式的向下转换:
(ClassIWantToCastTo)referenceIHave
13、C#提供了as关键字在运行时快速检测某个类型是否和另外一个兼容。如果我们使用as关键字,就可以通过检查null返回值来检测兼容性。
14、除了as关键字,C#还提供了is关键字来检测两个项是否兼容,然后,和as不同的是,如果类型不兼容,is返回false而不是null引用。
15、超级父类System.Object
重写ToString():正确的ToString()重写应该还说明继承连上定义的任何数据。如果重写ToString()让某个类来扩展自定义基类,第一件事就是使用base关键字从基类获取ToString()值。
1 class Person
2 {
3 public string FirstName { get; set;}
4 public string LastName {get; set;}
5 public int Age { get; set; }
6
7 public Person(string fName, string lName, int personAge)
8 {
9 FirstName = fName;
10 LastName = lName;
11 Age = personAge;
12 }
13 public Person() { }
14
15 public override string ToString()
16 {
17 string myState;
18 myState = string.Format("[First Name: {0}; Last Name: {1}; Age: {2}]",
19 FirstName, LastName, Age);
20 return myState;
21 }
22
23 public override bool Equals(object obj)
24 {
25 //不需要将obj强制转换为Person, 因为它们都有ToString()方法
26 return obj.ToString() == this.ToString();
27 }
28
29 public override int GetHashCode()
30 {
31 //根据person的ToString()值返回散列码
32 return this.ToString().GetHashCode();
33 }
34 }