C# 需要字段接口
C# require interface for field
我是一名 objective-C / swift 开发人员,正在为一个项目转向 C#。我正在寻找类似于协议的东西。我的研究表明我可以使用接口或抽象 class,这将非常适合我的目的。我正在尝试为其他地点的未来开发者做计划。
我的产品严重依赖 MVC 架构,因为它需要有一个通用的 UI,同时根据设施从不同的数据库中提取数据。在我舒适的 objective-C 世界中,我可以要求数据源对象实现协议,然后我知道编写新数据源对象的任何其他人都必须遵守预定义的数据源协议。在这一点上,我可以预期视图和控制器或多或少会像预期的那样对控制器代码进行最少的更改。
是否有 C# 等效项?有没有办法强制(或至少强烈推荐)控制器中的 class 字段始终实现接口或继承抽象 class?
尽管接口是一种途径,但您还可以通过继承和多态性进入 classes。这样,您可以让 base-class 具有具有给定签名的通用属性和方法。制作方法 "virtual" 将允许您 "override" 从该基础派生 classes。
此选项也有助于防止在处理 List(ofThings) 等常见事物时出现代码重复。您可以创建 "GetThings()" 的虚方法,而您的主方法 base-class 仍然可以循环运行它们。
因此,您可以选择多种途径。
从您的 post 看来,您确实很精明,因此您可能还想研究一下 "generics",这也是一个强大的功能。
接口就像一个合同,说任何使用我接口的东西都必须有你表达的所有组件、属性、方法。这会强制您在使用它的每个 class 上单独声明它们。
摘要 class 更像是 class 声明必须在 class 上找到的内容。
但是,定义一个 class WITH 代码来操作(无论什么),您可以从中派生而无需在整个过程中重复代码。
希望这些选项对您有所帮助,如果您询问有关您尝试做的事情的更多细节,这里的许多选项可以帮助您找到一种可能比其他方法更好的方法。
在这里使用接口是正确的方法。创建您的接口,向其添加方法签名,然后您的所有数据源都应实现此接口。
interface IDatasourceProvider
{
void Save();
}
class FilesystemDatasource : IDatasourceProvider
{
void Save()
{
// save to disk
}
}
class SqlServerDatasource : IDatasourceProvider
{
void Save()
{
// save to sql server
}
}
然后您可以使用 DI 将提供程序注入构造函数并使用它调用 Save()
,而不关心实际的实现。您可以使用接受 IDatasourceProvider
的方法的服务,您可以在其中调用 Save
。如果他们想使用该方法,这将强制调用传递接口的实现。
void SaveToDatasource(IDatasourceProvider provider)
{
provider.Save();
}
我是一名 objective-C / swift 开发人员,正在为一个项目转向 C#。我正在寻找类似于协议的东西。我的研究表明我可以使用接口或抽象 class,这将非常适合我的目的。我正在尝试为其他地点的未来开发者做计划。
我的产品严重依赖 MVC 架构,因为它需要有一个通用的 UI,同时根据设施从不同的数据库中提取数据。在我舒适的 objective-C 世界中,我可以要求数据源对象实现协议,然后我知道编写新数据源对象的任何其他人都必须遵守预定义的数据源协议。在这一点上,我可以预期视图和控制器或多或少会像预期的那样对控制器代码进行最少的更改。
是否有 C# 等效项?有没有办法强制(或至少强烈推荐)控制器中的 class 字段始终实现接口或继承抽象 class?
尽管接口是一种途径,但您还可以通过继承和多态性进入 classes。这样,您可以让 base-class 具有具有给定签名的通用属性和方法。制作方法 "virtual" 将允许您 "override" 从该基础派生 classes。
此选项也有助于防止在处理 List(ofThings) 等常见事物时出现代码重复。您可以创建 "GetThings()" 的虚方法,而您的主方法 base-class 仍然可以循环运行它们。
因此,您可以选择多种途径。
从您的 post 看来,您确实很精明,因此您可能还想研究一下 "generics",这也是一个强大的功能。
接口就像一个合同,说任何使用我接口的东西都必须有你表达的所有组件、属性、方法。这会强制您在使用它的每个 class 上单独声明它们。
摘要 class 更像是 class 声明必须在 class 上找到的内容。
但是,定义一个 class WITH 代码来操作(无论什么),您可以从中派生而无需在整个过程中重复代码。
希望这些选项对您有所帮助,如果您询问有关您尝试做的事情的更多细节,这里的许多选项可以帮助您找到一种可能比其他方法更好的方法。
在这里使用接口是正确的方法。创建您的接口,向其添加方法签名,然后您的所有数据源都应实现此接口。
interface IDatasourceProvider
{
void Save();
}
class FilesystemDatasource : IDatasourceProvider
{
void Save()
{
// save to disk
}
}
class SqlServerDatasource : IDatasourceProvider
{
void Save()
{
// save to sql server
}
}
然后您可以使用 DI 将提供程序注入构造函数并使用它调用 Save()
,而不关心实际的实现。您可以使用接受 IDatasourceProvider
的方法的服务,您可以在其中调用 Save
。如果他们想使用该方法,这将强制调用传递接口的实现。
void SaveToDatasource(IDatasourceProvider provider)
{
provider.Save();
}