实现接口的目的是抽象出实现 - IOW使用接口并且不关心实现类型,因此不需要用枚举值来标识它。
话虽如此,我会做的方式是有一个共同的基本类型,其既实现了接口,并有一个返回枚举抽象属性:
public abstract class BaseType : IAuditEvent
{
public abstract MyTypeEnum TypeId { get; }
... add any base implementation of the interface ...
}
然后在每个派生对象:
public class MyConcreteType : BaseType
{
public MyTypeEnum TypeId { get { return MyTypeEnum.SpecificValue; } }
... any overrides, etc ....
}
这种方法有两个优点:
它记ps清理你的代码。当在许多类中实现接口时,很可能会有一些接口的通用实现,即不同的对象可以共享的接口,可以放在基类中。明智地使用abstract
和virtual
方法/属性。
使用枚举来识别你的对象可以帮助避免那些无休止的,繁琐if (myObj.GetType() == typeof(ObjectA)) {} else if (myObject.GetType() == typeof(ObjectB))...
语句,当谈到时间根据实施者的类型分支 - 现在你可以使用switch语句基于返回的枚举TYPEID财产
你仍然会留下有延长枚举你应该增加更多实现的问题,但这是一个相对简单的代码改变,你必须recomplie无论如何,如果要添加更多的实现(所以扩展枚举不是什么大问题,但是如果可能的话,你确实想避免改变已经赋值的值)。
为了让'IAuditEvent'的成员识别特定类型的事件,为什么不好的做法是?潜在的问题是什么? –
哈哈!那就是我要问的。 ;-)我想有些人会争辩说,你给对象2种不同的方式来识别自己,而这2种方式可能会有不同意见。 – James
“通过枚举属性标识对象”是什么意思? GetType()可用于识别对象的类型,而不用于识别对象本身...... – user1027167