在某地方帮忙,闲来无事,打开《C#入门经典》继续看。哎,没网的情况下,很DT。
不记得上次自己看到哪一页了。感觉基类方法的隐藏与调用原来扫过一次,但是完全不记得方法了,故在此写下,以作备用。
***********************************分割线*************************************
1.隐藏基类方法:
private class BaseClass { public void DoSomething() { Console.WriteLine("Base-->DoSomething"); } } private class DerivedClass1 : BaseClass { public void DoSomething() { Console.WriteLine("Derived-->DoSomething"); } } private class DerivedClass2 : BaseClass {
}
运行结果:
小结:
虽然结果可以达到要求,但是编译器会提示有个warning,提示隐藏了基类方法,询问是有意为之,并提示有意为之的话可以使用关键字new。
当使用new关键字修饰DoSomething之后,warning消失。
同时,基类的方法,可以加virtual修饰,也可以不用,效果一样。
private class DerivedClass1 : BaseClass { new public void DoSomething() { Console.WriteLine("Derived-->DoSomething"); } }
***********************************分割线*************************************
2.重写基类方法
这里需要注意,重写与隐藏是不一样的,重写会修改基类代码而隐藏不会。
示例如下:
static void Main(string[] args) { Console.Write("new的基类: "); BaseClass newBaseClass = new BaseClass(); newBaseClass.DoSomething(); Console.Write("new的派生类: "); DerivedClass derivedClass = new DerivedClass(); derivedClass.DoSomething(); Console.Write("从派生类创建的基类: "); BaseClass derived2BaseClass = derivedClass; derived2BaseClass.DoSomething(); Console.ReadLine(); } private class BaseClass { public virtual void DoSomething() { Console.WriteLine("Base-->DoSomething"); } } private class DerivedClass : BaseClass { public override void DoSomething() { Console.WriteLine("Derived-->DoSomething"); } }
结果如下:
小结:
从运行结果可以看到,基类代码已经改变。所以第三次输出已经改变了输出。而上面使用同名进行隐藏的方法,即使也使用baseClass=derivedClass,输出结果仍然是基类的方法。
***********************************分割线*************************************
3.调用基类方法
可以使用base从而调用基类的方法,例如上面的代码中,如果在派生类的DoSomething后再加上base.DoSomething();就会再输出一个Base——>DoSomething
在这里就不示例了,感觉没什么好示例的。。。
***********************************分割线*************************************
P.S.书再向上翻一下,会看到下面的话:
类中的自动属性{get;set;}必须同时存在,无法只出现一个,如果要只出现一个,得自己重写。
好吧,发觉这个点我不清楚。。。所以在这再写下,提醒自己。