【发布时间】:2017-01-21 22:55:43
【问题描述】:
假设我有一堂课Book:
public class Book{
public string Title {get; set;}
}
我希望每本书都有一个 Read 函数,该函数返回一个字符串并接受一个页码 - 但每本书的内部结构都会有所不同(我知道这是个糟糕的例子)。如何定义必须由此类实例实现的函数的签名?
类似这样的:
public class Book{ // need to make this abstract?
public string Title {get; set;}
public abstract string Read(int pageNum);
}
// I want to define instances that define their own behavior...
public static Book It => new Book(){ // can't create instance of abstract...
Title = "It",
Read... // what do I do here?
}
我主要担心的是:
- 让事情尽可能简单。在抽象类下实现接口是可行的,但是当我添加更多实例时,它会让我担心 n*2 件事情。
- 我需要添加大量这些自定义函数 - 通过构造函数传递 Funcs 似乎很笨拙。
- 实际上 - 这用于定义
Tenant。Tenants是在内存中定义的,并且有许多静态属性,如domain、name、adminEmail等。这些是特定于租户的属性......但现在我正在尝试实现特定于租户的 行为 - 比如GetBooks或FilterUsers。我想让实现尽可能简单。现在我有“如果租户A,请执行此操作,否则如果租户B,请执行此操作......”贯穿我的代码。我正在尝试将所有特定于租户的逻辑和细节整合到一个地方 - 在Tenant类的实例上。 - 租户特定行为的更多示例 - 您有一个 SaaS 论坛软件。在论坛 A 的主页上,您
GetCoverPhoto通过读取静态文件。在论坛 B 的主页上,您GetCoverPhoto通过阅读博客主页。目前,我说“如果论坛 A,请执行此操作,否则如果论坛 B,请执行此操作”。这是我想在租户对象上而不是在代码中定义的租户特定行为类型。我不希望在我的核心逻辑中包含任何特定于租户的代码。
C# 语言中是否有一个简单的功能/模式可以实现这一点?
【问题讨论】:
-
@AlexD 我已经试过了 - 我会用我正在挣扎的地方更新我的问题。
-
啊,好吧,
abstract不适用于这里。您可以考虑让Read成为代表。 -
“通过构造函数传递 Funcs 看起来很笨拙” 真的吗?
Read = pageNumber => LoadPage(pageNumber)不实用?它准确地说明了您需要说的内容:对于Book的这个实例,您通过调用 LoadPage 方法来加载页面。为每个 Book 实例指定不同的读取行为的方法是为每个 Book 实例指定不同的读取行为。 -
@JoeWhite - 无需讽刺。我观察到包含 20 个项目的构造函数是不可取的,这并没有错。更不用说类声明中每个函数的 n*2 行(每个函数一个,然后每个用法一个)。连答案作者都同意。
-
如果我得到正确的要求,仍然不确定这些要求,但在我的编辑中有一些详细的答案。