Цель реализации интерфейса состоит в том, чтобы абстрагировать реализацию - IOW вы используете интерфейс и не заботитесь о типе реализации, поэтому не нужно идентифицировать его значением enum.
Сказав это, я бы использовал общий базовый тип, который реализует интерфейс и обладает абстрактным свойством, которое возвращает перечисление:
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 ....
}
У этого подхода есть пара преимуществ:
он сохраняет ваш код в чистоте. При реализации интерфейса в ряде классов существует большая вероятность того, что будет некоторая общая реализация интерфейса, которую могут совместно использовать различные объекты, которые могут входить в базовый класс. Разумно используйте методы / свойства abstract
и virtual
.
использование перечисления для идентификации ваших объектов может помочь избежать этих бесконечных и утомительных операторов if (myObj.GetType() == typeof(ObjectA)) {} else if (myObject.GetType() == typeof(ObjectB))...
, когда приходит время переходить в зависимости от типа разработчика - теперь вы можете просто использовать оператор switch на основе перечисления возвращается свойством TypeId
У вас все равно останется проблема с расширением enum, если вы добавите больше реализаций, но это относительно простое изменение кода, и вам придется все равно перекомпилировать, если вы добавляете больше реализаций (поэтому расширение enum не имеет большого значения, но вы по возможности не хотите изменять уже назначенные значения).