我正在更改提供数据的 API(这是对我的 original question 的更新)。一些搜索需要有关作者的数据并采用 IAuthor
对象。该 API 有一个 IAuthor
接口(interface)和一个实现 IAuthor
的具体类,称为 Author
。
我需要更改 Search.GetBooksByAuthor
方法的行为,以便在作者被标记为小说家时提供不同的语义。我听说过 open/closed principle并且更改 IAuthor
和/或 Author
和/或 Search
类似乎违反了这一点(Book
class 绝对保持不变,尽管如此)。那么如何进行这个简单的更改呢?
例如,我最初是这样想的,但我的想法可能很奇怪,因为它涉及更改 Search
类:
//Before
class Search
{
public Books[] GetBooks(IAuthor author){
// Call data access GetBooks...
}
}
//After
class Search
{
public Books[] GetBooks(IAuthor author){
// To maintain pre-existing behaviour
// call data access GetBooks method with SQL param @AsNovelist = false...
// (or don't pass anything because the SQL param defaults to false)
}
public Books[] GetBooksAsNovelist(IAuthor author){
// To get new behaviour
// call data access GetBooks method with SQL param @AsNovelist = true
// so that their non-fiction books are omitted from results
}
}
最佳答案
为了了解您的作者是否是 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 接口(interface)实现一个 bool 值成员并检查它。但是,以上内容会阻止您更改类结构。
这意味着您的小说家实际上仍然是作者,只是有自己的类型。你的方法签名保持不变,你的类结构保持不变你只是有一个“不同类型的作者”的类型,理论上应该没问题。调用如下进行测试。
GetBooks(new Novelist());
关于c# - 扩展(而不是更改)新行为的搜索类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14375378/