从编程语言直观了解面向对象
各种面向对象编程语言相互有别,但都能看到它们对面向对象三大机制的支持,即: “封装、继承、多态”
- 封装,隐藏内部实现
- 继承,复用现有代码
- 多态,改写对象行为
使用面向对象编程语言(如C#),可以推动程序员以面向对象的思维来思考软件设计结构,从而强化面向对象的编程范式。
C#是一门支持面向对象编程的优秀语言,包括:各种级别的封装支持;单实现继承+多接口实现;抽象方法与虚方法重写。
实例分析:
一、封装:面向对象设计是一种软件设计方法,是一种工程化规范。这是毫无疑问的。面向对象设计的主要工作包括:
概括地说,面向对象设计就是“根据需求决定所需的类、类的操作,以及类之间关联的过程”。
确定需要的类 |
我要定义一个数据库操作的类 |
给每个类提供一组完整的操作 |
我要一组完整的操作,比如数据库查询,数据的插入,更新,删除等, |
用C#来描述这一个概念
//定义了一个类,这个类是用来操作数据库的。
public class do_database
{
public static string connstr =
ConfigurationSettings.AppSettings["DBConnectionString"];
///<summary>
///执行查询语句,返回DataSet
///</summary>
///<param
name="SQLString">查询语句</param>
///<returns>DataSet</returns>
public static DataSet Query(string
SQLString)
{
using
(SqlConnection connection = new SqlConnection(connstr))
{
DataSet ds = new DataSet();
try
{
connection.Open();
SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
}
catch (System.Data.SqlClient.SqlException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}
///<summary>
///执行查询语句,返回SqlDataReader
///</summary>
///<param
name="strSQL">查询语句</param>
///<returns>SqlDataReader</returns>
public static SqlDataReader
ExecuteReader(string strSQL)
{
SqlConnection
connection = new SqlConnection(connstr);
SqlCommand cmd
= new SqlCommand(strSQL, connection);
try
{
connection.Open();
SqlDataReader myReader = cmd.ExecuteReader();
return myReader;
}
catch
(System.Data.SqlClient.SqlException e)
{
throw new Exception(e.Message);
}
}
///执行SQL语句,返回影响的记录数
///</summary>
///<param
name="SQLString">SQL语句</param>
///<returns>影响的记录数</returns>
public static int ExecuteSql(string
SQLString)
{
using
(SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(SQLString, connection))
{
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException E)
{
connection.Close();
throw new Exception(E.Message);
}
}
}
}
}
这些操作全部封装在do_database类中,这就是封装,隐藏内部实现。比如我要进行查询,结果放在一个DataSet的数据集中,我们就可以这样子操作:
DataSet myds =
do_database.Query(“查询语句”);至于查询语句如何一步一步执行,我们已经在do_databse封装好了。
二、继承:如果用UML的语言讲,继承就是类与类之间的关系是"is a".
上述数据库的操作的类,其实是针对SqlServer数据库的,实际上,我们在软件设计很多时候,要抛开数据库,也就是不管什么样子的数据库,都要能够很快的进行切换。
实际上,不管什么类型的数据库,操作都差不错,无非就是数据库的打开,查询,插入、更新、删除、关闭等。所以这一些是共性,但是每种数据库都有他自己的特性,所以共同的属性和操作我们可以用继承来实现。为了简单起见,我举一个很简单的例子来说明继承这一概念。
1、
首先定义一个水果类;
2、
定义一个橙子类,继承了水果类;
3、
定义一个苹果类,继承了水果类
publicclassFruit
{
publicDouble重量;
publicString颜色;
privateString私有属性;
publicvoid进货();
publicvoid销售();
}
publicclassOrange :
Fruit
{
Public void Orange()
{
Console.WriteLine("An orange is
got!");
}
}
publicclassApple :
Fruit
{
Public void Apple()
{
Console.WriteLine("An apple is
got!");
}
}
这样子定义的Orange类一样的有 重量、颜色的属性(注意私有属性在Orange中没有),也有进货,销售的操作;但是Orange有了一个Orange()的操作,而这个操作在Fruit中是没有的。这就是继承。
三、多态,多态的含义就是C#中允许多个方法的方法名相同,只要它们的方法签名不同就可以。如果简单一点讲,就是我定义了两个名字一样的方法,但是两个方法的参数不同,我们在调用的时候,程序会根据不同的参数调用不同的方法,这就是多态。当然这是比较通俗的理解,专业描述多态的概念是:当不同的对象接受到相同的消息名(或者说当不同的对象调用相同的名称的成员函数)时,可能引起不同的行为(执行不同的的代码)。这种现象称为多态性。
publicclassTest
{
publicstaticvoid
Print(string str)
{
Console.WriteLine(str);
}
publicstaticvoid Print(int i)
{
Console.WriteLine(i.ToString());//调用ToString方法把整型转换为string类型。
}
publicstaticvoid
Print(bool b)
{
if (b == true)//判断后输出结果。
{
Console.WriteLine("True");
}
else
{
Console.WriteLine("False");
}
}
publicstaticvoid
Print(paramsstring[] str)
{
//这个方法实现了对未知数量的参数的输出。使用params关键字。
for (int i =
0; i < str.Length; ++i)
{
Console.WriteLine(str[i]);
}
}
}
}
下面进行这些函数的调用
publicclassMainClass
{
publicstaticvoid Main()
{
bool a = false;
Test.Print("david","jack","mike");
Test.Print(5);
Test.Print(true);
Test.Print(a);
Test.Print("successful!");
}
}
}
长期的面向对象程序设计,我们隐约可以发现,好像很多东西,基本原理都是一样的,但是程序设计的工作量并没有因为程序设计的熟练度而减低,这个时候,我们可以考虑模式编程了。
模
式是实践经验的总结,也是一种设计思想的表述形式。在对待模式的态度上,我认为我们不应该抱着学习的态度,而应该抱着“了解”的态度。因为它是经验的总
结,不是靠读书学习就能得到的东西。“在做软件设计的时候,每个人都想使用某种模式来提高软件的韧度,却不是每个人都知道,在他的设计中,已经采用了这种
模式”,谈不谈模式其实都无所谓,只要你能说出你所设计的系统到底好在什么地方。
设计模式简介
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。
设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。
设计模式与面向对象
面向对象设计模式解决的是“类与相互通信的对象之间的组织关系,包括它们的角色、职责、协作方式几个方面。面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。面向对象设计模式描述的是软件设计,因此它是独立于编程语言的,但是面向对象设计模式的最终实现仍然要使用面向对象编程语言来表达,本课程基于C#语言,但实际上它适用于支持.NET框架的所有.NET语言,如Visual
Basic.NET、C++/CLI等。面向对象设计模式不像算法技巧,可以照搬照用,它是建立在对“面向对象”纯熟、深入的理解的基础上的经验性认识。掌握面向对象设计模式的前提是首先掌握“面向对象”!所以如果要想总结一些设计模式出来,必须精通面向对象的思想,因为这是一种思想,不是一种技术,需要一定的经验,一定的尝试,一定的运用实践才可以悟出来的。
目前我比较数量掌握的是工厂模式,有关详细的说明,可以看看我在广铁科技2007年第四期发表的一篇文章。这里不做详细阐述。