Tôi muốn có thể xác định một số đối tượng và đính kèm một số "hành vi" vào đối tượng đó nơi triển khai trong hành vi không có trong đối tượng. Rails giống như: actions_as_taggable. Như một ví dụ cụ thể, tôi muốn nói rằng Nhiệm vụ có thể được gắn thẻ. Tôi không muốn phải mã hóa bất cứ điều gì trong Task về Thẻ ngoài "cho phép" hành vi thông qua ... một giao diện? Trong đó có câu hỏi của tôi. Bạn không thể đặt triển khai trong giao diện. Tôi không muốn gây ô nhiễm lớp BaseObject [trừu tượng?] Của tôi với tất cả các triển khai có thể có.C# - Làm thế nào để thực hiện nhiều "kết hợp" một cách chính xác với Giao diện và/hoặc Lớp trừu tượng
Đối tượng: công tác, Lưu ý
Hành vi:. Taggable, gửi qua email, in, Deferrable (
Một nhiệm vụ có thể được gắn thẻ, gửi qua email, in, và trì hoãn Lưu ý có thể được gắn thẻ, gửi qua email, in , nhưng không trì hoãn.
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));
}
Thực hiện ITaggable trông giống như
{
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;
}
}
Vì vậy, các/cách chính xác nhất để làm điều này là những gì?
Jason
Thú vị, tôi sẽ phải suy nghĩ về điều này một số chi tiết. – user166255