OO Puzzle(2)

描述 :
Activity 代表一个活动,该活动可能有一次性的提醒(OnceAlarm)或者周期性的提醒(PeriodAlarm) 。
Alarm只能通过Activity进行访问, Activity存取的时候,将连带存取Alarm。

场景:
以下三行代码访问Alarm基类中的属性alarmDateTime

(注:请将以下的代码以伪代码待之)
int id = 4;
Activity activity = (Activity)ORM.GetDomainObjectById( "Activity" , id);
DateTime  start = activity.alarm.alarmDateTime;

在上面的代码中,activity.alarm的类型可能是OnceAlarm或者PeriodAlarm
如果是PeriodAlarm, 通过什么方式可以访问到PeriodAlarm中的public属性或PeriodAlarm所特有的行为

如果我们预先知道activity.alarm的类型,则可以通过downcast实现
Int interval = ((PeriodAlarm)activity.alarm).interval

但是我们通过一个Id获取到Activity的时候,往往无法预先知道Activity.Alarm实例的类型
那么只有通过憋足的类型判断实现
if ( activity.alarm is PeriodAlarm) then
{
    ...............
}

我觉得还有一种更别扭的方式,是给所有需要被Activity访问的PeriodAlarm的属性封装到一个方法中,该方法在基类中定义为抽象函数,除了PeriodAlarm,其它子类都采用空的实现。

问题:
(1)我想知道除了上面提到的几种类型,还有其它访问子类属性的方式么 ?
(2)是不是从OO设计原则上来说,如果Activity对 Alarm直接引用,就只应该访问Alarm基类的公有属性和行为?而不应该访问其继承类所特有的内容?
(3)DDD里面提到了Entity Object 和 Value Object的区别,ValueObject就只能通过EntityObject进行访问,ValueObject如果是一个继承树,是否是不好的设计?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值