C#图解教程读书笔记(第7章 类和继承)
1、所有的类都继承自object2、如何隐藏基类的成员要隐藏一个继承的数据成员,需要声明一个新的相同类型的成员,并使用相同的名称。 通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖继承的函数成员。请记住,签名由名称和参数列表组成,但不包括返回类型。 要让编译器知道你在故意隐藏继承的成员,使用new修饰符,没有它,程序可以成功编译,但编译器会警告你隐藏了一个继承成员。 也可以隐藏静态成员。 class SomeBase { public string cFiled; } class SomeClass: SomeBase { new public string cFiled; } 3、基类访问使用base.的形式。4、虚方法和覆写方法基类的方法使用virtual,派生类的方法使用override,这样,就可以在派生类中,改变基类的方法。 覆写的方法和被覆写的方法必须有相贩可访问性,换一种说法,被覆写的方法不能是private,而覆写的方法是public。 不能覆写static或非虚方法。 方法、属性和索引,以及称为事件的另一种类型,它们都可以被声明为virtual和override。 用override和new覆写函数 class Program { static void Main(string[]args) { MyBaseClasscBase = new MyBaseClass(); cBase.Print(); MyDerivedClasscDevrived = new MyDerivedClass(); cDevrived.Print(); SecondDerivedcSecond = new SecondDerived(); cSecond.Print(); MyBaseClasscBase2 = (MyBaseClass)cSecond; cBase2.Print(); cBase2.Print2(); Console.ReadKey(); } } class MyBaseClass { virtualpublic voidPrint() { Console.WriteLine("This is the base class"); } virtualpublic voidPrint2() { Console.WriteLine("This is the base class"); } } class MyDerivedClass: MyBaseClass { public override void Print() { Console.WriteLine("This is the derived class"); } overridepublic voidPrint2() { Console.WriteLine("This is the derived class"); } } class SecondDerived: MyDerivedClass { public override void Print() { Console.WriteLine("This is the Second Derived Class"); } new public void Print2() { Console.WriteLine("This is the Second Derived Class"); } } 输出内容: 用override不仅可以覆写函数,还可以覆写属性。 5、构造函数的顺序6、声明为public的程序,可以跨程序集继承。7、访问成员的区域private只在类的内部可访问 internal对该程序集内所有类可访问 protected对所有继承该类的类可访问 protectedinternal 对所有继承该类或在该程序集内声明的类可访问 public对任何类可访问 8、抽象成员用abstract修饰符标记,方法、属性、事件、索引均可以抽象。抽象成员没有实现体,被分号取代。而且必须被覆写。 ①尽管抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符加到abstract修饰符。 ②就像虚成员,派生类中抽象成员的实现必须指定override修饰符。 9、抽象类抽象类只能用作其它类的基类不能实例化。用abstract声明。 任何派生自抽象类必须使用override关键字实在该类所有的抽象成员,除非派生类自己也是抽象类。 10、密封类用sealed声明,必须是独立的类,不能用作基类。 11、静态类静态类需要声明为static,所有成员必需是静态的,可以有静态构造函数,但没有实例构造函数,不能创建该类的实例。静态类是隐匿是密封的。 12、扩展方法 class MyData { privatedouble dbD1; privatedouble dbD2; privatedouble dbD3; publicMyData(double d1, doubled2, double d3) { dbD1 = d1; dbD2 = d2; dbD3 = d3; } public double Sum() { returndbD1 + dbD2 + dbD3; } } static classExtendMyData { public static doubleAverage(this MyDatamd) { returnmd.Sum() / 3; } } 则可以直接用以下方法调用: MyDatamd = new MyData(3,4, 5); Console.WriteLine("Average:{0}", md.Average()); Console.ReadKey(); this必需作为第一参数,如果需要给 Average加参数,参考如下: publicstatic doubleAverage(this MyDatamd,int icount) { returnmd.Sum() / icount; } 调用时: MyDatamd = new MyData(3,4, 5); Console.WriteLine("Average:{0}", md.Average(3)); Console.ReadKey();
|