castle系列之一技术的基础知识

原创 2006年06月09日 18:41:00
技术的基础知识
 
面向对象的基本概念
 
 面向对象是一种程序设计方法,其基本思想是使用对象,类,继承,封装等进行程序设计,
根本目的是建立更加健壮,稳定,可维护的软件系统。面向对象的设计方法从现实世界中客观存在的事物出发构造软件系统,在系统构造中尽可能运用人类的自然思维方式。
 
类:
 类是用来描述具有相同行为和属性的实体,是构成系统的基本单位,从更加抽象的角度讲,
类是先生世界中事物的一个抽象,它反映了该事物在系统中需要保存和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体;客观世界是由类(对象)和类(对象)之间的联系组成的。
封装性:
封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:
  把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。
  信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。
  封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少查错和排错的难度。
多态性
对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或服务在一般类及其各个特殊类中具有不同的语义。例如:"几何图形""绘图"方法,"椭圆""多边形"都是"几何图"的子类,其"绘图"方法功能不同。
编译时多态有时也叫先期联编early binding),在编译时就能够确定类的成员方法被调用。方法重载就是实现了编译时多态..
运行时多态,有时也叫滞后联编(late binding), 系统在运行时,根据其实际类型确定调用类的成员方法。抽象类和接口专门用来实现运行时多态.
 
 
C#中几个容易遗忘的概念
 
接口:
接口就是约定,一个接口定义一个协定,实现接口的类或结构必须遵守其协定。
我们首先来看一个比较简单的例子:
// keyword_interface.cs
// Interface implementation
using System;
interface IPoint
{
   // Property signatures:
   int x
   {
      get;
      set;
   }
 
   int y
   {
      get;
      set;
   }
}
 
class MyPoint : IPoint
{
   // Fields:
   private int myX;
   private int myY;
 
   // Constructor:
   public MyPoint(int x, int y)
   {
      myX = x;
      myY = y;
   }
 
   // Property implementation:
   public int x
   {
      get
      {
         return myX;
      }
 
      set
      {
         myX = value;
      }
   }
 
   public int y
   {
      get
      {
         return myY;
      }
      set
      {
         myY = value;
      }
   }
}
 
class MainClass
{
   private static void PrintPoint(IPoint p)
   {
      Console.WriteLine("x={0}, y={1}", p.x, p.y);
   }
 
   public static void Main()
   {
      MyPoint p = new MyPoint(2,3);
      Console.Write("My Point: ");
      PrintPoint(p);
   }
}
输出
My Point: x=2, y=3
 
我们再看一个在系统使用的例子,你也可以petshop 3.0 , petshop 4.0中大量看到这种结构
见文件夹下面
Interfaceex项目
 
运行结果:
输入
1
出现结果:
Now, CalculateWages in TestService1
1000
输入
2
出现结果
Now, CalculateWages in TestService2
2000
 
输入0
退出系统
 
分析下里面的代码:
首先在项目Iservice中定义接口:
using System;
namespace IService
{
    
     public interface IEmployee
     {
         /// <summary>
         /// 计算工资
         /// </summary>
         double CalculateWages();
     }
}
其次在项目TestService1中实现接口:
using System;
using IService;
namespace TestService1
{
     /// <summary>
     /// 具体实现
     /// </summary>
     public class Employee:IEmployee
     {
         public Employee()
         {
             
         }
         public      double   CalculateWages()
         {
              Console.WriteLine("Now, CalculateWages in TestService1");
              double Wages=0;
              //经过计算 write code
              Wages=1000;
              return Wages;
         }
     }
}
在项目TestService2中实现接口
using System;
using IService;
namespace TestService2
{
     /// <summary>
     /// 具体实现
     /// </summary>
     public class Employee:IEmployee
     {
         public Employee()
         {
             
         }
         public      double   CalculateWages()
         {
              Console.WriteLine("Now, CalculateWages in TestService2");
              double Wages=0;
              //经过计算 write code
              Wages=2000;
              return Wages;
         }
     }
}
在项目ServiceFactory中根据名称选择具体实现的接口的类
using System;
using IService;
using System.Reflection;
namespace ServiceFactory
{
     /// <summary>
     /// 选择具体的程序集
     /// </summary>
     public class ServiceEmployee
     {
         public static IService.IEmployee Create(string Path)
         {
            string className=Path+".Employee";
            //是重要的技术,利用了反射,具体实现动态加载程序集
           return (IService.IEmployee)Assembly.Load(Path).CreateInstance(className);  
         }
     }
}
在Interfaceex中的调用:
string strPath=Console.ReadLine();
              while(strPath!="0")
              {    
                   if(strPath=="1"||strPath=="2")
                   {
                       string Path=ConfigurationSettings.AppSettings[strPath];
                    IService.IEmployee Employer=ServiceFactory.ServiceEmployee.Create(Path);
                        Console.WriteLine(Employer.CalculateWages().ToString());
                   }
                   strPath=Console.ReadLine();
              }
这样做的好处
1 调用和具体实现的分离,可以根据方便地进行分层开发,
2           结构清晰,维护性好 当某天需求发生变化时,可以新增项目TestService3实现Iservice接口的类,通过配制项目Interfaceex的App.config文件,就可以实现需要变化而不修改Interfaceex中的任何代码
接口和抽象类区别
 用abstract声明的类是一个抽象类,(来自msdn)::
  • 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
  • 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
  • 如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。
  • 如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。
 就自己的使用经验而言 接口不包含任何成员的实现而抽象类可以提供成员的实现是他们的最大区别。
反射(在运行时了解类型信息)
反射是指在运行时创建类型实例,然后调用和访问这些实例
当然通过反射命名空间中的类以及 System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如接口值类型)的信息
如果你有兴趣具体见:
NET 动态加载程序集 (一)
动态加栽程序集(二)
动态加载程序集(三)

Castle学习系列(九)---Windsor框架快速入门

Windsor是Castle提供的一个IOC框架,使用非常简单,支持批量注册。开始快速入门         首先引用dll   两个dll版本均是最新的3.3.0.0 新建两个接口文件IPrinter...
  • Eye_cng
  • Eye_cng
  • 2015年03月15日 14:54
  • 2859

UML 的九种模型图--UML建模基础知识

Trufun Plato Trufun Plato是新一代的UML建模软件,它将为您的软件分析设计提供高效快捷的建模工具。Trufun是在OMG发布UML2.2规范之后同步发布UML2.X工具的...
  • aswallow0323
  • aswallow0323
  • 2016年05月30日 16:33
  • 813

谈谈对.NET开源框架Castle的认识

对.NET平台下的一个非常优秀的开源项目--Castle使用过程进行了讲解
  • quwenzhe
  • quwenzhe
  • 2015年01月29日 07:23
  • 1469

利用一个Demo说明Castle+NHibernate的实现

Castle简单介绍 Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的...
  • xhl_james
  • xhl_james
  • 2017年06月18日 13:37
  • 294

技术人生系列 · 我和数据中心的故事——第一期

前 言 小y这个名字,是笔者临时想的一个笔名,其实没有什么特殊的含义,就暂且用他来代表我们这些为各个数据中心奉献自己青春的一群默默无闻的IT人吧! 小y今天要和...
  • xiao_y_ces
  • xiao_y_ces
  • 2016年01月14日 14:27
  • 716

Castle IOC容器快速入门

Castle ioc C#
  • paolei
  • paolei
  • 2016年04月21日 19:53
  • 1266

BI商业智能培训系列——(三)SSAS入门

维度可以理解为划分依据,简单的说就是看问题看数据的角度。维度通过属性和数据库的表挂钩,维度其实也就是属性的集合,这些属性是由数据源中表的列来提供。 数据表中主键,我们叫做键属性。除了键属性,其...
  • u010066934
  • u010066934
  • 2015年04月24日 21:48
  • 1393

分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装以及操作redis问题整理

redis简介redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据。当前主流的分布式缓存技术有redis,memcached,ssdb...
  • javaloveiphone
  • javaloveiphone
  • 2016年08月24日 17:40
  • 2072

【西川善司的3D图形技术连载】GPU和Shader技术的基础知识(1~8回)

本连载的主要目的,是介绍最新的PC和GAME所使用的最新3D图形技术的发展趋势。 暂时的方针是,首先是考虑介绍比较新的PC Game和PS3,XBOX360等新时代游戏机的游戏所采用的技术。 ...
  • FancyVin
  • FancyVin
  • 2017年02月14日 01:22
  • 460

30天了解30种技术系列---(8)终于等到你:Node.js

作为一名Programmer,我喜欢那些能够为时代变革做出贡献的技术。Git,Python,Android。。。都是其中的翘首。(包括我们百度的Echart,都是划时代的产品)。   而对...
  • jack19881225
  • jack19881225
  • 2015年08月17日 09:57
  • 332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:castle系列之一技术的基础知识
举报原因:
原因补充:

(最多只允许输入30个字)