描述 :
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如果是一个继承树,是否是不好的设计?