Serviceboy 发表于 2013-1-6 08:22:44

OOP设计思考——究竟是继承自普通类,还是继承自抽象类?

<div id="cnblogs_post_body">面向对象程序设计最基本的一个特点在于类可以继承——即通常我们所谓之“代码复用”原则优先。继承可以来自一个普通类,也可以来自一个抽象类,那么哪个更好一些呢?或者继承自普通类和抽象类在应用上有何区别呢?今天主要来讨论这个问题。
一、继承自普通类+virtual方法:
譬如我设计了一个点的类(Point),这个“点”类其中包含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]
查看完整版本: OOP设计思考——究竟是继承自普通类,还是继承自抽象类?