`
zjueman
  • 浏览: 32391 次
  • 来自: ...
社区版块
存档分类
最新评论

如何处理Value Object的继承关系

阅读更多
我有一个这样的问题:
类A是一个容器对象,包含了一个B对象的List. A和B都是VO对象,它们一起成为一个包含一些业务数据的数据结构。A返回给类C,类C是一个业务逻辑对象。它处理并显示A的内容,当然也要取出A里面的B做相应的处理。
问题是,现在我们有一个类似的业务,数据和原有的数据几乎相同,只是B里面多了一些东西。这时候,可以有下面三个选择:
1.修改B,加上新的内容。这样A包含B的数据结构也可以给新业务用。
2.创建新的类A2和B2,让他们完全是新的东西。但是这个问题是出现了重复的代码。唯一不同的是B2里面多了一些东西。
3.我感觉最理想的是B2继承B,添加新的东西。但这个问题是,新业务里面仍然使用A,只不过A里面包含的B2了。可是对于外部的业务处理类,比如C2,它怎么知道是B2而不是B呢?可以用强制类型转换,但这不是好的办法。
希望大家指点一下。

这基本上是一个VO对象的继承关系的处理问题。我翻了23各设计模式,没有看到适合的。
谢谢!
分享到:
评论
2 楼 flydeer2003 2007-11-08  
但value object如何抽象接口?接口一般好像都是用在业务对象上吧,不是很懂。
1 楼 jimmy_c 2007-10-30  
记得《敏捷开发》里有一个“依赖倒置原则”,说:不要依赖于具体的实现,而要依赖于接口。说的正好是这个场景。
从B和B2中抽象出接口IB,而A和C只使用IB。

zjueman 写道
但这个问题是,新业务里面仍然使用A,只不过A里面包含的B2了。可是对于外部的业务处理类,比如C2,它怎么知道是B2而不是B呢?可以用强制类型转换,但这不是好的办法。

这说明了你在C的实现中,有逻辑耦合的情况出现,即依赖于具体类的实现。如果能够做到解耦合,实现上面的方法就不难了。

相关推荐

    php-value-object:另一个用于处理Value Objects并防止Primitive Obsession的不良习惯的库

    5. **易于扩展**:开发者可以方便地创建自己的值对象,只需要继承库提供的基类,并定义其特定的属性和方法。 6. **代码复用**:值对象可以被多个类共享,减少了重复代码,提高了代码复用率。 7. **更好的可读性**...

    一个由MVC设计模式开发的例子,初学FLEX设计模式很好的资源

    得到的一系列参数存储在ValueObject类的公共变量中,ValueObject类是继承cairngrom类中valueobject类的,并且ValueObject文件是一个绑定的类 实例化事件并且把绑定类作为参数带过去,派发此事件 var historypassvalue:...

    Matlab Object Oriented Programming

    1. **继承**:通过`classdef`语句中的`符号指定父类,实现继承关系。例如: ```matlab classdef DerivedClass ... end ``` 2. **多态**:Matlab支持多态性,即不同类的对象可以使用相同的接口,但实际执行的...

    最完整的Object Pascal语言介绍(中文版)

    Object Pascal使用`try`、`except`和`finally`关键字进行异常处理。例如: ```pascal try // 代码可能抛出异常 except on E: Exception do Writeln('An error occurred: ', E.Message); end; ``` 五、单元(Unit...

    Object方法和属性1

    原型在JavaScript中是一个至关重要的概念,它决定了对象之间的继承关系。 `Object.create(null)`是一个特殊用法,用来创建一个没有任何原型的新对象。这意味着这个新对象不会继承任何属性或方法,包括像`toString()...

    Object Pascal 编程指南

    Object Pascal 提供了异常处理机制,通过 `try...except...finally` 语句块来捕获和处理运行时错误。例如: ```pascal try // 可能抛出异常的代码 except on E: Exception do ShowMessage('An error occurred: '...

    Object-C/Swift官网文档

    4. **KVC(Key-Value Coding)和KVO(Key-Value Observing)**:提供动态访问属性和监听属性变化的能力。 5. **NSObjects和内存管理**:了解如何正确使用`retain`, `release`以及`autorelease`进行内存管理是基础。 ...

    Python学习资料之继承

    在Python编程语言中,继承是面向对象编程的一个关键特性,它允许我们创建一个新类(子类),这个新类能够从已存在的类(父类)中继承属性和方法。这样的设计模式有助于代码重用,提高模块化,并使程序结构更加清晰。...

    ObjectBox.zip

    **ObjectBox配置与基本使用详解** ObjectBox是一个专为移动设备设计的高性能、轻量级的对象持久化库,尤其...在实际开发中,根据具体需求,可以进一步探索ObjectBox的高级功能,如关系管理、事务处理、查询优化等。

    NC总帐API帮助文档

    继承者 nc.vo.pub.ValueObject 继承者 nc.vo.gl.pubvoucher.DetailVO 所有已实现的接口: java.io.Serializable, java.lang.Cloneable, java.util.EventListener, nc.vo.gl.vouchervaluechange....

    JavaScript中的Object对象学习教程

    Object.prototype上的`valueOf`和`toString`方法是所有对象实例都继承的方法。`valueOf`默认返回对象本身,但在自动类型转换时会被调用。`toString`方法则返回对象的字符串表示,对于不同类型的数据,返回的字符串...

    object-c编写的计算器

    Objective-C是C语言的超集,增加了面向对象的特性,如类、继承、多态和消息传递。在这个计算器项目中,我们首先会接触到基本的语法和编程概念。例如,`@interface`和`@implementation`关键字用于定义类的结构和实现...

    Object Pascal参考手册

    Object Pascal提供了异常处理机制,通过try...except...finally语句块来捕获和处理运行时错误。 5. **内存管理** - **引用计数(Reference Counting)**:在VCL(Visual Component Library)框架下,对象通过引用...

    Object-Oriented Programming with PHP5 使用PHP5进行面向对象编程(英文版)

    $myObject->property = "Some value"; $myObject->myMethod(); ``` 3. 继承:继承允许一个类(子类)继承另一个类(父类)的属性和方法,减少了代码重复,提高了代码复用性。使用`extends`关键字实现继承。 ```php...

    浅析JavaScript中的对象类型Object_.docx

    `isPrototypeOf(object)`方法则用来判断传入的对象是否是另一个对象的原型,这在处理继承关系和原型链时很有帮助。 `toLocaleString()`返回根据当前地区设置的字符串表示,而`toString()`和`valueOf()`则通常用来...

    object-c 编程 2

    1. **面向对象编程基础**:Object-C是面向对象的语言,它包括类、对象、继承、多态和封装等核心概念。 2. **语法特性**:Objective-C在其C语言基础上扩展了消息传递机制,使动态类型成为可能。例如,`[对象 方法]`...

    C#继承的应用.ppt

    每个C#类(除了Object类)都有一个基类和任意多的基接口,而System.Object是所有类的最终基类。 结构(值类型)在C#中不支持实现继承,但可以实现接口。结构自动派生自System.ValueType,并可以派生自多个接口。与...

    js对象,五种继承 详细讲解

    - **原型式继承**:使用`Object.create()`,但不是为了继承,而是复制一个对象。 - **寄生组合式继承**:通过复制父类型的原型来改进组合继承,避免父类型引用计数增加,提高性能。 3. **JavaScript代码结构与...

    Android AIDL Object实现步骤

    创建一个`MyService`类,继承自`Service`,并实现`IService.Stub`: ```java public class MyService extends Service { private final IService.Stub binder = new IService.Stub() { @Override public void ...

    abap_object.ppt

    ### ABAP Object面向对象编程详解 #### 一、面向过程与面向对象 在软件开发领域,编程范式是解决问题的不同方式。其中最常见的是面向过程(Procedural Programming)和面向对象(Object-Oriented Programming,...

Global site tag (gtag.js) - Google Analytics