为新行为扩展(而不是更改)搜索类?

时间:2013-01-17 09:01:19

标签: c# oop interface

我正在更改提供数据的API(这是对我original question的更新)。某些搜索需要有关作者的数据并采用IAuthor对象。 API有一个IAuthor接口和一个实现名为IAuthor的{​​{1}}的具体类。

当作者被标记为小说家时,我需要更改Author方法的行为以提供不同的语义。我听说过open/closed principle,似乎更改Search.GetBooksByAuthor和/或IAuthor和/或Author类会违反此Search但是,类肯定保持不变。那怎么做这个简单的改变?

例如,我最初在想这样的事情,但我的想法可能很糟糕,因为它涉及更改Book类:

Search

6 个答案:

答案 0 :(得分:1)

如何使用谓词进行过滤?

class Search
{
   public Books[] GetBooks(IAuthor author, Func<IAuthor, bool> filter){
       // ...
    }
}

search.GetBooks(author, a => a.IsNovelist)

答案 1 :(得分:1)

似乎很明显,某些事情必须改变才能知道你的作者是否是Novelist,你可以通过以下两种方式之一做到这一点。你不需要在理论上改变任何东西,但是你需要一个新的类。

public class Novelist : Author, IAuthor { }

然后你可以将小说家传递给你的方法,然后确定你的作者类型。

class Search 
{
   public Books[] GetBooks(IAuthor author){
       if(author is Novelist)
         //Do some stuff or set a flag/bool value
    }
}

或者如前所述,在Author界面中实现一个布尔成员并检查它。以上情况会阻止您更改类结构。

这意味着你的小说家实际上仍然是作家,它只是拥有自己的类型。你的方法签名保持不变,你的类结构保持不变你只有一个“不同类型的作者”的类型,理论上应该没问题。请按以下方式进行测试。

GetBooks(new Novelist());

答案 2 :(得分:1)

为了扩展类C#.NET在.NET 3.5中引入extension methods,其主要目的是在不修改现有代码的情况下扩展类:

public static class SearchExtensions
{
  public static Books[] GetBooksAsNovelist(this Search search, IAuthor author)
  {
     // Perform novelist search
  }
}

然后您可以通过以下方式正常调用您的Search类:

Search.GetBooksAsNovelist(author);

答案 3 :(得分:1)

您可以使用C#语言的扩展功能。

请参阅http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx

Extensions允许通过保持类完整来为类添加功能。

在您的情况下,您可以写为:

public static class SearchExtensions
    {
        public static Books[] GetBooks(this Search search, IAuthor author)
        {
            //new logic
        }
    }   

您可以通过搜索对象访问此新方法,搜索类也保持不变。

如果您觉得有帮助,请与我们联系。

答案 4 :(得分:1)

你可以让你的类部分能够在没有扩展,继承或控制反转的情况下添加functionalyti:

// file: Search.cs

partial class Search
{
    public Books[] GetBooks(IAuthor author) { ... }
}

// file: Search.Advanced.cs

partial class Search
{
    public Books[] GetBooksAsNovelist(IAuthor author) { ... }
}

结果:

http://i.snag.gy/VowNv.jpg

答案 5 :(得分:0)

将搜索类方法保持为虚拟,这样任何人都可以覆盖它们来创建新行为吗?