OOP设计思考——究竟是继承自普通类,还是继承自抽象类?
<div id="cnblogs_post_body">面向对象程序设计最基本的一个特点在于类可以继承&mdash;&mdash;即通常我们所谓之&ldquo;代码复用&rdquo;原则优先。继承可以来自一个普通类,也可以来自一个抽象类,那么哪个更好一些呢?或者继承自普通类和抽象类在应用上有何区别呢?今天主要来讨论这个问题。一、继承自普通类+virtual方法:
譬如我设计了一个点的类(Point),这个&ldquo;点&rdquo;类其中包含X,Y两个基本公共属性。那么以后随着需求增加我或许要定义一个三维的店DPoint,由于从数学角度分析,三维坐标比二维坐标只是多了一个Z,其余属性基本相似。因此直接可以通过继承二维坐标的Point类扩展一个Z属性即可。
进一步考虑。如果我已知一个点,输入另外一个点的坐标或者实体类,求该两点间距离公式的话。我们可以在Point类中增加一个计算两点间距离公式的函数,但是考虑这个公式不能为子类所使用(因为子类是三维坐标点,父类却是二维坐标点),因此子类的方法必须覆盖父类计算自己的坐标距离公式,因而通过virtual做这样的扩展(给出完整代码):
<div class="cnblogs_code">namespace CSharp{ /// <summary> /// 父类 /// </summary> public class Point { public double X { get; set; } public double Y { get; set; } public virtual double Distance(Point p) { //省略实现部分 } } public class DPoint:Point { public double Z { get; set; } public override double Distance(Point p) { DPoint dp = p as DPoint; if (dp!=null) { //省略实现部分 } else { throw new Exception("二维坐标点不能和三维坐标点混淆计算。"); } } }}
页:
[1]