У меня есть класс, который использует пустой интерфейс в качестве "интерфейса маркера", например:
namespace MyNameSpace
{
public interface IMessage
{
//nothing in common here...
}
public class MyMessage : IMessage
{
public void SendMyMessage()
{
//Do something here
}
}
}
Я читаю в некоторых других сообщениях, но также и в MSDN (http://msdn.microsoft.com/en-us/library/ms182128.aspx), чего следует избегать, и вы должны использовать пользовательские атрибуты вместо этого пустого интерфейса. Итак, я мог бы реорганизовать свой код следующим образом:
namespace MyNameSpace
{
public class MessageAttribute : Attribute
{
//nothing in common here...
}
[MessageAttribute]
public class MyMessage
{
public void SendMyMessage()
{
//Do something here
}
}
}
Все работает отлично, но главный вопрос:
Когда у меня есть общий метод в другом месте моей программы, например:
public IEnumerable<T> GetAll<T>() where T : IMessage
{
//Return all IMessage things here
}
В вышеприведенной функции мне нужно добавить некоторые общие ограничения типа на T
, поэтому разрешены только IMessages
.
Как я мог выполнить это при использовании настраиваемого атрибута вместо пустого интерфейса?
И оправдывает ли это использование пустого интерфейса? Или я должен использовать пустой абстрактный класс Message
(вместо интерфейса IMessage
, так как MyMessage
на самом деле является Message
).
Очень интересно, что вы думаете об этом.