- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有一个类 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?
}
我主要担心的是:
Tenant
。 Tenant
是在内存中定义的,并且具有许多静态属性,例如 domain
、name
、adminEmail
等。这些是特定于租户的属性...但现在我正在尝试实现特定于租户的行为 - 例如GetBooks
或FilterUsers
。我想让实现尽可能简单。现在,我的代码中到处都是“如果是租户 A,则执行此操作,否则,如果是租户 B,则执行此操作……”。我正在尝试将所有特定于租户的逻辑和细节整合到一个地方 - 在 Tenant
类的实例上。GetCoverPhoto
。在论坛 B 的主页上,您通过阅读博客主页来GetCoverPhoto
。目前,我说“如果是论坛 A,则执行此操作,否则如果是论坛 B,则执行此操作”。这是我想在租户对象上而不是在代码中定义的特定于租户的行为类型。我不想在我的核心逻辑中包含任何特定于租户的代码。C# 语言中是否有一个简单的功能/模式可以实现这一点?
最佳答案
NineBerry 说的很有道理。
还有另一种方法可以完成您可能想要的。如果你想动态地将 read 方法实现注入(inject)到 Book 中。这可以看作是 strategy pattern .并且可以像在许多语言中一样作为接口(interface)来完成,但在 C# 中以最简单的形式它可以由委托(delegate)来完成。示例:
public class Book{
Func<int, string> readFunc;
public Book(Func<int, string> readFunc)
{
this.readFunc = readFunc;
}
public string Title {get; set;}
public string Read(int pageNum) { return readFunc(pageNum); }
}
然后将其用作:
public static Book It => new Book(){
Title = "It",
Read = (pageNum) => ... // Do actual reading in delegate
}
编辑:有了更多关于要求的细节(但仍然不是一切都显而易见)我会做这样的事情:
public class Tenant
{
// core things go here
public Extensions Extensions { get; }
}
public class Extensions : IEnumerable<IExtension>
{
private IList<IExtension> list = new List<IExtension();
private Tenant { get; set; }
public Extensions(Tenant tenant)
{
Tenant = tenant;
}
public void Add(IExtension extension)
{
extension.Tenant = Tenant;
list.Add(extension);
}
}
public interface IExtension
{
Tenant { get; set; }
// shared interface of extensions if any can be abstracted
}
public interface ICoverPhotoExtension : IExtension
{
Photo GetCoverPhoto();
}
public class FileCoverPhotoExtension : ICoverPhotoExtension
{
public Tenant { get; set; }
Photo GetCoverPhoto() { } // gets photo from file
}
public class BlogCoverPhotoExtension : ICoverPhotoExtension
{
public Tenant { get; set; }
Photo GetCoverPhoto() { } // gets photo from blog
}
用法:
Tenant tenant; // initialized somehow
var coverPhotoExtension = tenant.Extensions.FirstOrDefault<ICoverPhotoExtension>();
Photo photo = coverPhotoExtension?.GetCoverPhoto();
关于c# - 如何定义必须由类的实例实现的函数的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785425/
中同一行中未对齐的
-
详解C语言sscanf()函数、vsscanf()函数、vscanf()函数
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件:
?
-
php - 如何解释at()函数; substr()函数;伪代码中的exist()函数
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
-
VBS教程:函数-CStr 函数
CStr 函数
返回表达式,该表达式已被转换为 String 子类型的 Variant。
CStr(expression)
expression 参数是任意有效的表达式。
说明
通常,可以
-
VBS教程:函数-CSng 函数
CSng 函数
返回表达式,该表达式已被转换为 Single 子类型的 Variant。
CSng(expression)
expression 参数是任意有效的表达式。
说明
通常,可
-
VBS教程:函数-CreateObject 函数
CreateObject 函数
创建并返回对 Automation 对象的引用。
CreateObject(servername.typename [, location])
参数
serv
-
VBS教程:函数-Cos 函数
Cos 函数
返回某个角的余弦值。
Cos(number)
number 参数可以是任何将某个角表示为弧度的有效数值表达式。
说明
Cos 函数取某个角并返回直角三角形两边的比值。此比值是
-
VBS教程:函数-CLng 函数
CLng 函数
返回表达式,此表达式已被转换为 Long 子类型的 Variant。
CLng(expression)
expression 参数是任意有效的表达式。
说明
通常,您可以使
-
VBS教程:函数-CInt 函数
CInt 函数
返回表达式,此表达式已被转换为 Integer 子类型的 Variant。
CInt(expression)
expression 参数是任意有效的表达式。
说明
通常,可
-
VBS教程:函数-Chr 函数
Chr 函数
返回与指定的 ANSI 字符代码相对应的字符。
Chr(charcode)
charcode 参数是可以标识字符的数字。
说明
从 0 到 31 的数字表示标准的不可打印的
-
VBS教程:函数-CDbl 函数
CDbl 函数
返回表达式,此表达式已被转换为 Double 子类型的 Variant。
CDbl(expression)
expression 参数是任意有效的表达式。
说明
通常,您可
-
VBS教程:函数-CDate 函数
CDate 函数
返回表达式,此表达式已被转换为 Date 子类型的 Variant。
CDate(date)
date 参数是任意有效的日期表达式。
说明
IsDate 函数用于判断 d
-
VBS教程:函数-CCur 函数
CCur 函数
返回表达式,此表达式已被转换为 Currency 子类型的 Variant。
CCur(expression)
expression 参数是任意有效的表达式。
说明
通常,
-
VBS教程:函数-CByte 函数
CByte 函数
返回表达式,此表达式已被转换为 Byte 子类型的 Variant。
CByte(expression)
expression 参数是任意有效的表达式。
说明
通常,可以
-
VBS教程:函数-CBool 函数
CBool 函数
返回表达式,此表达式已转换为 Boolean 子类型的 Variant。
CBool(expression)
expression 是任意有效的表达式。
说明
如果 ex
-
VBS教程:函数-Atn 函数
Atn 函数
返回数值的反正切值。
Atn(number)
number 参数可以是任意有效的数值表达式。
说明
Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
-
VBS教程:函数-Asc 函数
Asc 函数
返回与字符串的第一个字母对应的 ANSI 字符代码。
Asc(string)
string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
-
VBS教程:函数-Array 函数
Array 函数
返回包含数组的 Variant。
Array(arglist)
arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
-
VBS教程:函数-Abs 函数
Abs 函数
返回数字的绝对值。
Abs(number)
number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
-
VBS教程:函数-FormatPercent 函数
FormatPercent 函数
返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。
FormatPercent(expression[,NumDigitsAfterD
-
VBS教程:函数-FormatNumber 函数
FormatNumber 函数
返回表达式,此表达式已被格式化为数值。
FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
作者热门文章
- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
滴滴打车优惠券免费领取
我是一名优秀的程序员,十分优秀!