C# 给定增量合成的类,我如何用一些设计模式实现替换它们,同时只定义一次方法体?

C# 给定增量合成的类,我如何用一些设计模式实现替换它们,同时只定义一次方法体?,c#,expandoobject,expando,C#,Expandoobject,Expando,我不认为设计模式可以在这种意义上使用。 案例场景中有一个基本对象,该对象具有这些属性和始终定义的相应getter/setter:(id、name、content)。除此之外,还有一些对象具有可选属性和相应的getter/setter(注释、作者、删除)。 我希望这些对象为API提供我所需要的确切属性/方法 一种方法是把所有的东西都放在一个状态膨胀的类中 class Article { int id; int name; String content; List&l

我不认为设计模式可以在这种意义上使用。 案例场景中有一个基本对象,该对象具有这些属性和始终定义的相应getter/setter:(id、name、content)。除此之外,还有一些对象具有可选属性和相应的getter/setter(注释、作者、删除)。 我希望这些对象为API提供我所需要的确切属性/方法

一种方法是把所有的东西都放在一个状态膨胀的类中

class Article {
    int id;
    int name;
    String content;
    List<Comment> comments;
    Author author;
    bool deleted;

    //getters and setters omitted 
}
对于
deletedarticlewithauthor和comments
,我想要如下内容:

 Article article = new AuthorOnArticle(new DeletedOnArticle(new CommentsOnArticle(new Article())));
或其他一些符号,如:

 Article article = new MergerForArticle();
 article.add(CommentForArticle.class);
 article.add(DeletedForArticle.class);
 article.add(AuthorForArticle.class);
因此,换句话说,我希望避免定义所有可能的类的排列,而只是有一个“动态类声明”

编辑:我也在考虑反射(例如Java反射)——但我不知道这是否是一个好的做法

Edit2:我也在考虑匿名类,并以某种方式将实现作为lambda函数传递??(Java现在支持lambda函数),但同样,接口中的所有内容都必须实现:(


Edit3:有人指出要使用Expando对象,所以我相应地修改了问题,因为没有设计模式来完成这项工作。Java替代模式可以是:

当某些基类型的不同实现可以嵌套在另一个基类型中时,使用装饰器模式,并且当调用一个方法时,会得到方法结果通过调用所有嵌套对象的相同方法来实现。例如,假设您有一个coffee类,您还可以向您的咖啡中添加调味品。可以向咖啡中添加单摩卡,也可以向咖啡中添加双摩卡或奶油。每种调味品的价格不同,您不知道将在手前向咖啡中添加什么调味品。然后,您可以使用装饰图案。你可以用调味品装饰咖啡,当你调用成本法时,你将得到总成本,即咖啡价格加上所有调味品。(顺便说一句,这个例子来自Head First Design Patterns book,如果你没有这样做,我建议你读这本书)


你的情况不是这样的。我认为你可以只使用一个字典。在每个类中,用适合该类的所有属性初始化字典。

你要找的基本上是c#的类型和s。你可以在运行时创建一个你想要的类型

例如:

class Program
{
    static void Main(string[] args)
    {
        dynamic sampleObject = new ExpandoObject();

        // Create a new event and initialize it with null.
        sampleObject.sampleEvent = null;

        // Add an event handler.
        sampleObject.sampleEvent += new EventHandler(SampleHandler);

        // Raise an event for testing purposes.
        sampleObject.sampleEvent(sampleObject, new EventArgs());
   }

    // Event handler.
    static void SampleHandler(object sender, EventArgs e)
    {
        Console.WriteLine("SampleHandler for {0} event", sender);
    }
}
当然,JavaScript也有类似的功能,因为您可以在运行时随意添加和删除类的属性


这种行为可以追溯到SmallTalk。但它实际上只是语言可以支持的东西,而不是设计模式。

我认为PHP最接近于分部类的是。我个人不使用分部类,但它们可能会对您的需求有所帮助。对我来说,创建
Article
class作为域模型似乎更好,在需要时附加其他类集合,如注释。还有,这是我吹毛求疵的地方,有没有像没有作者的文章这样的东西?有趣的是,我会看看Traits!这些字段是完全组成的。似乎对于Traits,我仍然必须定义所有的属性类是否正确?@cracketastic您也可以将Article视为不包含Author的DTO对象;)为什么不使用字典呢。并在每个类中用所需的状态初始化字典,并使用适合该类的内容。创建2^3个接口,创建一个实现所有接口的类。每个操作都可以是从一个接口映射到另一个接口的扩展方法。但我不确定我会推荐它,因为它不能扩展到很多不同的属性。
 Article article = new MergerForArticle();
 article.add(CommentForArticle.class);
 article.add(DeletedForArticle.class);
 article.add(AuthorForArticle.class);
class Program
{
    static void Main(string[] args)
    {
        dynamic sampleObject = new ExpandoObject();

        // Create a new event and initialize it with null.
        sampleObject.sampleEvent = null;

        // Add an event handler.
        sampleObject.sampleEvent += new EventHandler(SampleHandler);

        // Raise an event for testing purposes.
        sampleObject.sampleEvent(sampleObject, new EventArgs());
   }

    // Event handler.
    static void SampleHandler(object sender, EventArgs e)
    {
        Console.WriteLine("SampleHandler for {0} event", sender);
    }
}