gpt4 book ai didi

c# - 如何使用接口(interface)和/或抽象类正确执行 MULTIPLE "mixins"

转载 作者:太空狗 更新时间:2023-10-29 23:42:35 25 4
gpt4 key购买 nike

我希望能够定义一些对象并将一些“行为”附加到该对象,其中实现在行为中而不是在对象中。类 Rails:acts_as_taggable。作为一个具体的例子,我想说Tasks can be Tagged。除了通过……界面“启用”行为之外,我不想在有关标签的任务中编写任何代码?这就是我的问题。您不能将实现放在接口(interface)中。我不想用 所有 可能的实现污染我的 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;
}
}

那么正确/最好的方法是什么?

杰森

最佳答案

好吧,有很多方法,具体取决于您要如何实现。在您的示例中,按照以下方式做一些事情可能会更好:

public interface IBehavior
{
... common behavior methods like maybe
bool Execute(object value)
}

public class Taggable : IBehavior
{
... tag specific items
public bool Execute(object value) { ... }
}

public class Note
{
public List<IBehavior> Behaviors { get; set; }
public void ProcessNote()
{
this.Behaviors(d=>d.Execute(this));
}
}

这种变体将允许您始终添加更多行为,而不必对您的类结构进行任何重大更改,例如在您希望支持新行为的每个类上实现一个接口(interface)。您可能想在您的行为类中提出您的共同对象是什么,以使其更容易用于您的场景。因此,您可以使用泛型来进行更多类型的定义。

您可能还想看看装饰器模式,以获得更多想法。

关于c# - 如何使用接口(interface)和/或抽象类正确执行 MULTIPLE "mixins",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2023461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com