Я хочу иметь возможность определять некоторые объекты и прикреплять некоторые «поведения» к тому объекту, где реализация находится в поведении, а не в объекте. Похожий на Rails: acts_as_taggable. В качестве конкретного примера я хочу сказать, что задачи могут быть помечены. Я не хочу кодировать что-либо в «Задаче о тегах», кроме «включения» поведения через ... интерфейс? В этом и заключается мой вопрос. Вы не можете поместить реализацию в интерфейс. Я не хочу загрязнять мой класс BaseObject [abstract?] С всеми из возможных реализаций.
Объекты: Задача, Примечание
Поведения: Taggable, по электронной почте, для печати, отложенный (
Задача может быть помечена, отправлена по электронной почте, распечатана и отложена.
Примечание может быть помечено, отправлено по электронной почте, напечатано, но не отложено.
BaseObject
public class BaseObject
{
Guid ID { get; set; }
}
tag.cs
public class Tag : BaseObject
{
public Guid Id { get; set; }
public String Title { get; set; }
}
itaggable.cs
public interface ITaggable
{
void AddTag(Tag tag);
... other Tag methods ...
}
task.cs
public class Task : BaseObject, ITaggable, IEmailable, IPrintable
{
Task specified functionality... nothing about "taggging"
}
note.cs
...
TagCollection.cs
public class TagCollection : List<Tag>
{
public string[] ToStringArray()
{
string[] s = new string[this.Count];
for (int i = 0; i < this.Count; i++)
s[i] = this[i].TagName;
return s;
}
public override string ToString()
{
return String.Join(",", this.ToStringArray());
}
public void Add(string tagName)
{
this.Add(new Tag(tagName));
}
Реализация ITaggable выглядит примерно так:
{
private TagCollection _tc;
private TagCollection tc
{
get
{
if (null == _tc)
{
_tc = new TagCollection();
}
return _tc;
}
set { _tc = value; }
}
public void AddTag(Tag tag)
{
tc.Add(tag);
}
public void AddTags(TagCollection tags)
{
tc.AddRange(tags);
}
public TagCollection GetTags()
{
return tc;
}
}
Так какой правильный / лучший способ сделать это?
Джейсон