首页 > Python基础教程 >
-
C#教程之C#学习笔记4
1.C#只支持单一继承,若想要实现多重继承的效果。有2种方式:
第一种为传递继承,A为基类,B继承A,C继承B,通过传递来增迭要包含的元素,但这种继承的设计,在业务上具有明显的从属关系。
第二种为聚合,在关联关系中,如果定义了包容对象的一个核心组件,就会发生聚合。对于多重继承,这涉及挑选一个类作为主要基类(PdaItem),然后从中派生出个新类 (Contact),第二个希望的基类(Person)作为派生类(Contact)中的一个字段添加。接着字段 (Person) 上的所有非私有成员都在派生类(Contact) 上重新定义。然后,派生类 (Contact) 将调用委托给字段 (Person)。由于方法要重新声明,所以一些代码会重复,但是重复的代码不会根多,因为实际的方法主体只在聚合类 (Person)中实现。
2.不要在构造器中调用会影响所构造对象的任何虚方法,因为假如这个虚方法在当前要实例化的类型的派生类型中进行重写,就会调用重写的实现。但在继承层次结构中,基类正在构造而派生类还没构造。所以,调用虚方法将导致无法预测的行为。
3.new修饰符:new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。如果使用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。
4.sealed修饰符:除了可以修饰类(密封类,不能派生),virtual成员也可以密封,如A类有个虚方法Say(),B类继承后重写Say(),B类为了不让后面的派生类重写Say(),可以使用sealed修饰。
5.is运算符:不仅仅是检查数据是否能够转换到目标类型,且还会检查对象本身类型是否真的是目标类型。因此能够强制转换的对象,不一定是目标类型。如Thing类代码。
public class Thing { public static explicit operator string(Thing thing) { return thing.ToString(); } public override string ToString() { return "Thing"; } public static void Test() { string s = "text"; Thing t = new Thing(); object o = t; Trace.Assert(!(t is string)); Trace.Assert((string)t == "Thing"); o = s; Trace.Assert((string)o == "text"); Trace.Assert(o is string); Console.WriteLine("Ok"); } } public class PdaItem { public DateTime CreateTime { get; set; } public DateTime ModifyTime { get; set; } public string Name { get; set; } protected string ObjectKey { get; set; } } public class Contact : PdaItem { private Person internalPerson;//Person类的详细代码,在上一章已列出 public string Address { get; set; } public string Phone { get; set; } public string FirstName { get { return internalPerson.FirstName; } set { internalPerson.FirstName = value; } } public string LastName { get { return internalPerson.LastName; } set { internalPerson.LastName = value; } } }
---------------------以上内容根据《C#本质论 第三版》进行整理