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

标签 c# oop interface

我正在更改提供数据的 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/

相关文章:

c# - 为什么可以从属性访问私有(private) const 字段?

c# - 如何在 C# 中使图表图例项具有交互性

c# - 如何制作内部界面图案?

c# - 排除/包含导航属性

java - 匿名类和接口(interface)

struct - Go 中的自动类型断言

c# - 引发类型实现接口(interface)的对象的事件

c# - 无法在 dotnet core 2.1 中注册日志记录

php - 这是封装吗?

ruby - 为什么 Rails 使用 RUBY_EVAL 来定义方法?