1、隐藏基类方法:
(1)在子类中使用new关键字显示的隐藏基类中的方法,基类的方法是虚拟的或非虚拟的都可以;
(2)如果继承的方法是虚拟的(virtual),可以用override关键字重写方法的实现代码。
public class MyBaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base");
}
}
public class MyDerivedClass:MyBaseClass
{
public new/*override*/ void DoSomething()
{
Console.WriteLine("Derived");
}
}
使用new和override的区别:
MyDerivedClass mdc = new MyDerivedClass();
MyBaseClass mbc;
mbc = mdc;
mbc.DoSomething();
如上调用时,如果是用new重写基类方法,则结果是:Base。即,尽管隐藏了基类的实现代码,但仍可以通过基类访问它。
如果是用override重写基类方法,则结果是:Derived。即,重写方法将替换基类中的实现代码,即使通过基类类型访问也是执行的重写后的代码。
2、类中使用base和this关键字:
base关键字表示包含在派生类中的基类的实现代码。base引用的是对象实例,因此不能在静态成员中使用base关键字。
this关键字表示当前的对象实例。this也是引用的对象实例,因此也不能在静态成员中使用this关键字。因为静态成员不是对象实例的一部分。
3、嵌套类:
嵌套类可以访问其包含类的私有和受保护成员。如:
public class ClassA
{
private int state = -1;
public int State
{
get { return state; }
set { state = value; }
}
public class ClassB
{
public void SetPrivateState(ClassA target,int newState)
{
target.state = newState;
}
}
}
调用:
ClassA myObject = new ClassA();
Console.WriteLine("myObject.State={0}", myObject.State);
ClassA.ClassB myOtherObject = new ClassA.ClassB();
myOtherObject.SetPrivateState(myObject, 999);
Console.WriteLine("myObject.State={0}", myObject.State);
结果输出:
myObject.State=-1
myObject.State=999