我正在更改提供数据的API(这是对我original question的更新)。某些搜索需要有关作者的数据并采用IAuthor
对象。 API有一个IAuthor
接口和一个实现名为IAuthor
的{{1}}的具体类。
当作者被标记为小说家时,我需要更改Author
方法的行为以提供不同的语义。我听说过open/closed principle,似乎更改Search.GetBooksByAuthor
和/或IAuthor
和/或Author
类会违反此Search
但是,类肯定保持不变。那怎么做这个简单的改变?
例如,我最初在想这样的事情,但我的想法可能很糟糕,因为它涉及更改Book
类:
Search
答案 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) { ... }
}
结果:
答案 5 :(得分:0)
将搜索类方法保持为虚拟,这样任何人都可以覆盖它们来创建新行为吗?