要隐藏一个继承的数据成员,需要声明一个新的相同类型的成员,并使用相同的名称。
通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖继承的函数成员。请记住,签名由名称和参数列表组成,但不包括返回类型。
要让编译器知道你在故意隐藏继承的成员,使用new修饰符,没有它,程序可以成功编译,但编译器会警告你隐藏了一个继承成员。
也可以隐藏静态成员。
classSomeBase
{
publicstring cFiled;
}
classSomeClass : SomeBase
{
newpublicstring cFiled;
}
基类的方法使用virtual,派生类的方法使用override,这样,就可以在派生类中,改变基类的方法。
覆写的方法和被覆写的方法必须有相贩 可访问性,换一种说法,被覆写的方法不能是private,而覆写的方法是public。
不能覆写static或非虚方法。
方法、属性和索引,以及称为事件的另一种类型,它们都可以被声明为virtual和override。
用override和new覆写函数
classProgram
{
staticvoid Main(string[] args)
{
MyBaseClass cBase = newMyBaseClass();
cBase.Print();
MyDerivedClass cDevrived = newMyDerivedClass();
cDevrived.Print();
SecondDerived cSecond = newSecondDerived();
cSecond.Print();
MyBaseClass cBase2 = (MyBaseClass)cSecond;
cBase2.Print();
cBase2.Print2();
Console.ReadKey();
}
}
classMyBaseClass
{
virtualpublicvoid Print()
{
Console.WriteLine("This is the base class");
}
virtualpublicvoid Print2()
{
Console.WriteLine("This is the base class");
}
}
classMyDerivedClass : MyBaseClass
{
publicoverridevoid Print()
{
Console.WriteLine("This is the derived class");
}
overridepublicvoid Print2()
{
Console.WriteLine("This is the derived class");
}
}
classSecondDerived : MyDerivedClass
{
publicoverridevoid Print()
{
Console.WriteLine("This is the Second Derived Class");
}
newpublicvoid Print2()
{
Console.WriteLine("This is the Second Derived Class");
}
}
输出内容:
用override不仅可以覆写函数,还可以覆写属性。
private 只在类的内部可访问
internal 对该程序集内所有类可访问
protected 对所有继承该类的类可访问
protected internal 对所有继承该类或在该程序集内声明的类可访问
public 对任何类可访问
用abstract修饰符标记,方法、属性、事件、索引均可以抽象。抽象成员没有实现体,被分号取代。而且必须被覆写。
①尽管抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符加到abstract修饰符。
②就像虚成员,派生类中抽象成员的实现必须指定override修饰符。
抽象类只能用作其它类的基类不能实例化。用abstract声明。
任何派生自抽象类必须使用override关键字实在该类所有的抽象成员,除非派生类自己也是抽象类。
用sealed声明,必须是独立的类,不能用作基类。
静态类需要声明为static,所有成员必需是静态的,可以有静态构造函数,但没有实例构造函数,不能创建该类的实例。静态类是隐匿是密封的。
classMyData
{
privatedouble dbD1;
privatedouble dbD2;
privatedouble dbD3;
public MyData(double d1, double d2, double d3)
{
dbD1 = d1;
dbD2 = d2;
dbD3 = d3;
}
publicdouble Sum()
{
return dbD1 + dbD2 + dbD3;
}
}
staticclassExtendMyData
{
publicstaticdouble Average(thisMyData md)
{
return md.Sum() / 3;
}
}
则可以直接用以下方法调用:
MyData md = newMyData(3, 4, 5);
Console.WriteLine("Average:{0}", md.Average());
Console.ReadKey();
this必需作为第一参数,如果需要给 Average加参数,参考如下:
publicstaticdouble Average(thisMyData md,int icount)
{
return md.Sum() / icount;
}
调用时:
MyData md = newMyData(3, 4, 5);
Console.WriteLine("Average:{0}", md.Average(3));
Console.ReadKey();
C#图解教程读书笔记(第7章 类和继承),布布扣,bubuko.com
原文:http://www.cnblogs.com/pengjia89/p/3643731.html