我有 2 个 Activity
对象(假设是空的和预定的事件,不受我控制)共享一些行为,比如预订事件的人、房间该事件发生的地点、事件类型、主题等。
我创建了两个包装器对象(EmptyWrapper
和 ScheduledWrapper
),它们有一个父类(super class) ActivityWrapper
,它实现了两个子对象共有的一些方法并且具有子包装器相应响应的一些抽象方法/属性。它们在行为上非常相似,但有一个关键的区别,你只能在空位时安排事件!结构是这样的(非常简化的代码):
public class EmptyWrapper : AppWrapper
{
EmptySlot _emptySlot;
public EmptySlotWrapper(EmptySlot emptySlot) : base()
{
this._emptySlot = emptySlot;
}
public override string Id
{
get { return _emptySlot.AgendaId; }
}
public override string Room;
{
get{ return _emptySlot.Room;}
}
public override string Person
{
get{ return _emptySlot.Person;}
}
public override string AppType;
{
get{ return "Empty";}
}
public override bool IsAppSlot()
{
return false;
}
public override bool IsEmptySlot()
{
return true;
}
public override bool CanPerformOperations()
{
return true;
}
public void ReserveApp(ObjWithActivityInfo actObj)
{
(...)
}
}
ActivityWrapper
类似但包裹的对象不同,IsAppSlot
返回 true,IsEmptySlot
返回 false,CanPerformOperations
并且没有 ReserveApp()
方法。
接下来是基类:
public abstract class AppWrapper
{
public abstract string Collaborator { get; }
public abstract string Room { get; }
public abstract string AppType { get;}
public AppWrapper()
{ }
public abstract bool IsAppSlot();
public abstract bool IsEmptySlot();
public abstract bool CanPerformOperations();
public virtual string GetTextToShow()
{
return Person + " - " + Room;
}
(...)
}
在我的代码中,我只想引用 ActivityWrapper
,因为对于一般操作(显示信息和外观)我不需要实现。当我需要为空位预订事件时,问题就出现了。那时,在我的代码中,我将 AppointmentWrapper
转换为 EmptyWrapper
并为事件保留插槽(它仍然是一个 EmptySlot
但它保留给选定的事件),否则,如果转换不成功,我什么都不做,因为它不是正确的 Activity
类型。
这是正确的,还是我应该在两个包装器中实现 ReserveActivity()
方法并让 ActivityWrapper
不执行任何操作?
或者我应该用另一种方式来做这件事吗?也许要改变类的结构?
抱歉,文字太长了。
最佳答案
向不需要它的类添加函数是没有意义的。这会破坏您继承的意义。
我会做一个安全的转换......
var i = obj as theClass
然后测试是否为空。我会使用一些 linq 来选择所有具有您定义的属性的对象,以指示它们被设置为 true 的类型。
您可以用另一种方式来做,这样可以节省类型转换和测试,但这意味着设计对局外人来说不那么明显。
我认为这是一个品味问题,但更喜欢你做事的方式。我不确定我是否喜欢 bool 属性来识别类型。如果您再次继承基类怎么办?此外,您还可以通过强制转换来识别类型 - 具有更深层次对象结构的类型可能更有用。
不过,我同意您使用抽象类集合的愿望。
关于c# - 使用实现而不是抽象或更改实现是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4068921/