现在很多设计中推崇接口和依赖注入(dependency
injection),而不倾向于采用继承机制来构造程序结构。但很多时候作为一种简便而廉价的封装方法,继承仍然是不可或缺的.
例如与一些Engine打交道的时候,需要实现某些特定的接口. 在osworkflow中, 我们需要实现FunctionProvider接口,
interface FunctionProvider{
void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException;
}
在Quartz中需要实现Job接口
interface Job{
public void
execute(JobExecutionContext context) throws JobExecutionException;
}
这些接口是一种技术性的要求, 它们表示了代码生存所依赖的技术环境. 为了屏蔽这种对于外部引擎的依赖, 我们可以简单的选择实现一个基类,
abstract class AbstractFunction implements FunctionProvider,Runnable{
Map transientVars;
Map args;
PropertySet ps;
public final void execute(Map transientVars, Map args, PropertySet ps){
this.transientVars = transientVars;
this.args = args;
this.ps = ps;
run();
}
public Object getPersistVar(String name){
return ps.getAsActualType(name);
}
public void setPersistVar(String name, Object value){
ps.setAsActualType(name,value);
}
public void removePersistVar(String name){
ps.remove(name);
}
}
在派生类中我们只要使用getPersistVar等函数就可以回避对于osworkflow特有的PropertySet类的依赖,而只在概念上需要一
个对象的持久化机制.当我们把业务代码从osworkflow移植到其他工作流引擎的时候, 只需要改变一下基类即可.我们可以在基类中引入更加特殊的假
设,
abstract AbstractBusinessFunction extends AbstractFunction{
public BusinessObject getBusinessObject(){
return transientVars.get("businessObject");
}
public void commonBusinessOp(){ ... }
}
AbstractBusinessFunction提供的可以是一个完整的业务对象环境, 我们在派生类中的所有代码都可以是与业务直接相关的,而与具体
的技术实现无关(例如业务变量是存放在transientVars中还是存放在args中)
class BusinessFunction extends AbstractBusinessFunction{
public void run(){
BusinessObject bo = getBusinessObject();
bo.methodA();
commonBusinessOp();
}
}
对于我们来说实际有意义的是在派生类中所书写的代码,基类仅仅提供一个环境而已.无论我们使用Ioc注入业务变量还是从transientVars中主动
获取业务变量,都是与我们的业务操作无关的. 实际上在理论上我们希望整个基类都可以是注入的(包括业务变量和业务操作),在泛型编程中这对应于所谓的
policy class.
分享到:
相关推荐
通过理解和熟练运用这些概念,开发者能够构建出符合业务需求、高效运行的.NET应用程序。在学习过程中,结合实例和视频教程(如“传智播客.Net培训—C#面向对象基础”系列课程)会有助于更好地理解这些概念。同时,...
子类如`Organization`、`Department`、`Post`,这些子类在结构上类似,它们根据实际需要继承基类的属性,并且可以通过构造函数传递类型信息给基类。 特别地,对于包含特有属性的子类,如`Person`类,除了继承基类...
面向对象软件构造是一种现代软件开发方法,它基于面向对象编程(OOP)的概念,强调将现实世界中的问题抽象为对象,通过对象之间的交互来解决问题。Delphi是一款强大的集成开发环境(IDE),它以其高效的编译器和VCL...
通过"Rose实例+构造银行业务模型.doc"这个文档,你将能够看到上述各种UML图的实际应用,学习如何使用Rose工具创建和编辑这些图,以及如何利用这些图来表达和分析银行业务模型。这个过程不仅可以加深对UML的理解,也...
在OOSC中,软件被组织成一系列相互协作的对象,这些对象通过封装、继承和多态等机制来实现复杂的功能。 1. 封装:封装是面向对象的核心特性之一,它将数据和操作这些数据的方法捆绑在一起,形成一个独立的单元——...
在`案例3:通过实例来剖析C#继承机制`中,你可能将看到如何创建一个实际的继承链,如何调用父类和子类的方法,以及如何利用继承实现特定的业务逻辑。通过这种方式,你可以更深入地理解C#继承的实际应用和优势。 总...
### ATL揭秘之“对象创建”篇 当我们使用Visual C++的ATL...它隐藏了对象创建的具体细节,允许开发者专注于业务逻辑而不必担心底层实现。通过理解ATL的工作原理,我们可以更好地利用其功能,提高开发效率和代码质量。
3. 构造器:子类不直接继承父类的构造器,但可以在自己的构造器中通过`super()`调用来调用父类的构造器,以初始化从父类继承的属性。 在给定的汽车管理系统示例中,我们可以定义一个`Vehicle`类,包含描述车辆的...
面向对象编程是一种编程范式,它基于“对象”概念,通过封装、继承和多态等特性来设计和组织代码。在PHP中,每个类定义了一种数据类型,类可以包含属性(变量)和方法(函数),用于描述对象的状态和行为。 **封装*...
1. **提供无参数构造器**:这是Hibernate框架的基本要求之一,确保Hibernate能够通过反射机制创建对象实例。 2. **提供标识属性**:标识属性是对象唯一的标识,通常映射到数据库表中的主键字段。例如,在一个用户...
通过原型、构造函数和原型链,我们可以创建具有继承关系的对象,实现代码的复用和模块化。在实际开发中,理解并熟练掌握这些概念对于编写高效、可维护的JavaScript代码至关重要。通过阅读`prototype.js`这样的示例...
在此期间,对象可以被多个线程访问,参与方法调用,执行业务逻辑,存储数据等。 **不可视阶段(Invisible)** 当一个对象的引用不再被程序中的任何活动线程直接持有,但仍然可以通过其他方式(如软引用、弱引用、虚...
通过设置一个对象的原型为另一个对象,第一个对象就能继承第二个对象的所有属性和方法。此外,ES6引入了类和extend关键字,使得JScript的继承更加符合传统面向对象的语言风格。 5. **封装** 封装是面向对象的核心...
你需要熟练掌握如何定义和初始化对象,如何编写构造函数和析构函数,理解虚函数和纯虚函数的作用,以及如何利用MFC创建窗口程序。 在准备考试的过程中,练习是至关重要的。通过解决课件中的习题和模拟试题,你可以...
8. **面向对象分析与设计**:OOA(面向对象分析)关注业务需求的建模,而OOD(面向对象设计)则关注如何将这些需求转化为软件结构。 9. **案例分析**:课程可能通过实际项目或例子,如学生管理系统、图形用户界面等...
2. C++是一种混合性面向对象语言,它不仅支持传统的面向过程编程,还支持面向对象编程,具有广泛的应用基础和丰富的开发环境,对面向对象编程的普及起到了关键作用。 3. 面向对象技术的三大基本特征是封装、继承和...
1. **类(Class)**:C#是一种面向对象的语言,类是它的基本构造块。在这个计算器项目中,可能定义了多个类,如`Calculator`、`Operation`等,用来表示不同的计算操作和整体的计算器结构。类帮助组织代码并提供数据和...
在“13-面向对象-第5天(面向对象其他知识点)-讲义共7页”中,我们可以期待学习到面向对象编程的一些高级和扩展概念,这些可能包括但不限于继承、多态、抽象类、接口、封装、构造函数以及设计模式等。 首先,继承...
首先使用面向对象的思想,继承QWidget,如果多组件,可以使用多继承; def __init__(self, parent=None): super().__init__(parent) 其次定义号初始化gui的内容,将gui方法放入构造器里面初始化; 最后在_main_中...
VC++,全称Visual C++,是微软公司开发的一款强大的C++集成开发环境,它支持面向对象编程,并且提供了丰富的类库,如MFC(Microsoft Foundation Classes),方便开发者进行Windows应用程序的开发。 在学习面向对象...