C#之类的理解
不想按照传统教科书的方式去讲解类和对象涉及的一些概念(类与对象的关系,构造函数和析构函数,对象的声明和实例化,public,private,protected,类的继承,类的多态等等)。这些概念应该结合具体的实例去理解,才能更好的体会到这些东西存在的意义。
这篇文章试图说明下类这个东西被发明出来的意义。在面向对象设计语言出现之前,也就是c语言的时代,主要的程序开发方法是面向过程的方式,采用功能分解,自顶向下,将复杂的处理层层分解的方式。类的出现其实是一种自然而然过程。
初学面向对象的同学不要被类及其相关的一些概念所吓倒,我们可以将类理解为类型。微软的.NET框架(其他的平台语言也是,例如java)提供的一些最基础,最常用的类型(int,string,datetime等)。这些都是类。而我们在软件开发的过程中,在解决现实问题的过程中,会遇到各种不同的需求和场景。这时就需要我们对基础类型进行组合,抽象出真实世界的类型。我们可以看一下微软为我们设计的日期DateTime类型。以下是它的一些属性(部分):
public DateTime Date { get; }
public int Day { get; }
public DayOfWeek DayOfWeek { get; }
public int DayOfYear { get; }
public int Hour { get; }
public int Minute { get; }
public int Month { get; }
public static DateTime Now { get; }
public int Second { get; }
public int Year { get; }
它有以下一些方法(部分)
public DateTime AddDays(double value);
public DateTime AddHours(double value);
public DateTime AddMinutes(double value);
public DateTime AddMonths(int months);
public DateTime AddSeconds(double value);
public string ToLongDateString();
public string ToShortTimeString();
稍微分析一下这些属性和方法的确是日期这样的一个类型所必需的。
举个例子,假设我们开发一个学校管理系统,我们可能需要有学生对象
class Student
{
string strName;//姓名
int nAge;//年龄
decimal dIntelligenceFactor; //智商
decimal dHardworkingDegree; //勤奋程度
...
}
可能这样设计教室对象
class ClassRoom
{
int nBuildingNo; //楼号
int nFloor;//楼层
decimal dArea;//面积
}
如果我们了解了List<T>这样的泛型集合类之后,我们会很自然的设计出合理的班级类型
class Class
{
string strClassName;//班级名称
ClassRoom classRoom; //所在教室
List<Student> lstStudents; //班级学生
}
由上面可见,所有的客观世界中的需求,都可以抽象成基本类型的组合再组合。一般我们开发某个系统的时候,先要抽象(设计)出该系统中的一个个领域对象,这些领域对象可能是简单的基本类型的组合,也可能是一些抽象出来的领域对象的再组合。