Je veux être en mesure de définir certains objets et attacher certains "comportements" à cet objet où l'implémentation est dans le comportement pas dans l'objet. Rails-like: acts_as_taggable. À titre d'exemple concret, je veux dire que les tâches peuvent être étiquetées. Je ne veux pas avoir à coder quoi que ce soit dans Tâche sur les balises au-delà de "activer" le comportement via ... une interface? Là réside ma question. Vous ne pouvez pas mettre l'implémentation dans une interface. Je ne veux pas polluer ma classe BaseObject [abstract?] Avec tous des implémentations possibles.C# - Comment faire MULTIPLE "mixins" correctement avec des interfaces et/ou des classes abstraites
Objets: tâche, note
Behaviors:. Tagable, Emailable, imprimable, Deferrable (
Une tâche peut être étiquetée, envoyé par courrier électronique, imprimé et reporté Une note peut être étiquetée, envoyé par courrier électronique, imprimé , mais pas différé.
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));
}
La mise en œuvre de ITaggable ressemble à quelque chose comme
{
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;
}
}
Alors, quelle est la bonne/meilleure façon de le faire?
Jason
Intéressant, je vais devoir penser à celui-ci un peu plus. – user166255