C#之浅析⾯向对象编程思想(⼆)
<pre name="code" class="csharp">//My concern is my chief concern.
俗话说:“龙⽣龙凤⽣凤,⽼⿏的⼉⼦会打洞”,可见在⽣活中,这种⾯向对象的思想(既“继承”)已经深⼊⼈⼼,这篇博客,就主要针对“继承”这个概念做稍微深⼊⼀点的总结。
⼀、继承的实现
所谓的继承:即派⽣类对基类的特性进⾏共享以及具体化。看代码:
(⼀)、常规继承
namespace JiCheng
{
public class Baseclass
{
public void Show()
{
Console.WriteLine("这是基类中的内容。");
}
}
public class Derivedclass : Baseclass
{
public void shownew()
{
Console.WriteLine("这是派⽣类中的内容。");
}
}
class Example
{
static void Main(string[] args)
{
Derivedclass aclass=new Derivedclass();
aclass.Show();
aclass.shownew();
}
}
}
代码显⽰结果:
这是基类中的内容。
这是派⽣类中的内容。
分析:Derivedclass 继承 Baseclass类,在Example这个类中实例化Derivedclass对象aclass,然后分别调⽤基类派⽣类中的⽅法,这种形式通过继承实现了派⽣类对于基类的扩充。
(⼆)、派⽣类成员隐藏基类成员
<span >namespace JiCheng
{
public class Baseclass
{
public void Show()
{
Console.WriteLine("这是基类中的内容。");
}
}
public class Derivedclass : Baseclass
{
public void Show()
{
Console.WriteLine("派⽣类的⽅法隐藏了基类的⽅法");writeline函数
}
}
class Example
{
static void Main(string[] args)
{
Derivedclass newclass = new Derivedclass();
newclass.Show();
}
}
}</span><span >
</span>
结合第⼀个例⼦,该例⼦中基类和派⽣类中的⽅法名相同,此时的结果为:
派⽣类的⽅法隐藏了基类的⽅法。
然⽽此时会有提醒:
我们在派⽣类中把⽅法改为:publicnew void Show()即可去掉该警告,从⽽实现对基类⽅法的隐藏。
通过这两个例⼦以及上⼀篇博客中对UML图中继承的关系可知,对于最基本的继承实现已经可以掌握。⼆、访问修饰符对继承性的影响
基类访问修饰符可以访问的类型可以访问的类型可以访问的类型Public基类派⽣类外部代码Protected基类派⽣类
private基类
这张表是我对基类中三类访问修饰符对于外部代码、派⽣类何时访问的总结。
举例:
就像上⾯第⼀个例⼦中,Baseclass为基类,Derivedclass为派⽣类,Example为外部代码。此时,对于Baseclass的访问,则要根据Baseclass中访问修饰符来决定了。
如果Baseclass中Show()⽅法的访问修饰符是public,则Derivedclass和Example均可对其进⾏访问,同理,若是protected,在Derivedclass中可以访问,但是在Example中尽管实例化Derivedclass也不可以实现对基类的访问(通过实验验证)。
⽽对于private,仅仅能在Baseclass中对其进⾏调⽤(代码仍为上⾯的代码,对基类的访问修饰符进⾏修改即可)。
三、重写与base关键字
(⼀)、重写
派⽣类可能要执⾏基类中同名成员的不同任务时,这就需要重写的过程了。同时重写时基类⽅法必须是要⽤abstract、virtual、override(多重继承)这些修饰符进⾏修饰的。
问:为何需要在重写的时候⽤到abstract、virtual、override?
答:请看上⾯所举例⼦中的警告:
若不是继承抽象的、虚的、继承的⽅法,则基类的⽅法将会被隐藏。
代码格式:
Public class Baseclass  //基类
{
Public virtual void Show() //基类⽅法
{
Console.WriteLine(“基类中的⽅法”);
}
}
Public class Derivedclass:Baseclass //派⽣类
{
Public override void Show()  //派⽣类⽅法
{
Console.WriteLine(“派⽣类中重载的⽅法”)
}
}
在外部代码中实例化派⽣类,派⽣类对象调⽤Show⽅法,则显⽰:
“派⽣类中重载的⽅法”。
由此区别于隐藏基类⽅法的例⼦,但是若要对基类中的Show⽅法同时调⽤,这时就需要⽤到base关键字。
(⼆)、base关键字
Base关键字的作⽤可以总结为:
1、调⽤已经被重写的基类的⽅法;
2、调⽤构造函数;
代码展⽰:
1、调⽤已经被重写的基类的⽅法
class Baseclass
{
Public virtual void Show()
{
}
}
Class Derivedclass:Baseclass
{
Public override void Show()
{
Base.Show();  //此时在该⽅法中则调⽤了基类中的⽅法。
}
}
2、调⽤构造函数
namespace JiCheng
{
public class Baseclass
{
int num;
public Baseclass() //构造函数⼀
{
Console.WriteLine("基类构造函数⼀:Baseclass()");
}
public Baseclass(int i) //带参数的构造函数
{
num = i;
Console.WriteLine("基类构造函数⼆:Baseclass(int i)");
}
}
public class Derivedclass : Baseclass
{
public Derivedclass()
: base() //调⽤构造函数⼀
{
}
public Derivedclass(int i)
: base(i) //调⽤带参数的构造函数
{
}
}
class program
{
static void Main(string[] args)
{
Derivedclass see = new Derivedclass();  //实例化派⽣类,意在调⽤⽆参的构造函数;
Derivedclass para = new Derivedclass(3);  //实例化派⽣类,同时调⽤含有参数的构造函数。        }
}
}
在上⾯的例⼦中:
public class Derivedclass : Baseclass
{
public Derivedclass()
:
base()//调⽤构造函数⼀
{
}
public Derivedclass(int i)
:base(i)//调⽤带参数的构造函数
{
}
}
结果:
基类构造函数⼀:Baseclass()
基类构造函数⼆:Baseclass(inti)
Base如上所述⽤来对基类构造函数进⾏调⽤,在《⼤话设计模式》的学习中,⼤量的例⼦中都有这样的调⽤,学习要在知其然的同时更要知其所以然,以后再遇到base关键字的时候,就再也不怕了。
总结:通过对C#继承进⾏详细的总结,之前问题本上遗留的⼀些继承、base关键字、访问修饰符等问题基本上都解决了,对于在设计模式中代码的认识也有了新的⾼度。不⾜之处即总结的过于冗余,写完之后才发现写了这么多东西,以后尽量精简⼀写。
遗留问题:重写时abstract⽅法和virtual⽅法如何进⾏区别?什么时候⽤?希望能和⼤家⼀起交流。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。