我正在创建一个模块化类型系统,一个应用程序(主机)将其他模块加载到通用 UI 界面中,我还为此创建了一个 API,可供其他用户使用。
在某些情况下,API 使用接口(interface)和抽象类来强制使用 API 的客户端实现特定方法。
我不能对所有事情都使用接口(interface),因为有些东西我需要放入自己的 body 中,因此最终用户不需要自己实现所有不必要的事件和方法。 EG:所以我自己处理大小更改事件,然后将大小传递给他实现的名为 SizeChanged 的函数,这样他就可以通过大小更改来处理他的程序。
抽象类是我真正想要使用的,但我不能,因为用户拥有的控件可能需要 XAML 中指定的 x:Name 并且会收到错误:
The type ... cannot have a Name attribute. Values types and types without a default constructor can be used as items within ResourceDictionary.
发生错误是因为需要创建它的实例: Inherited Window can not have a name?
据我所知,唯一可用的解决方案是使用带有可以重写的虚拟方法的常规类,并且确实工作正常,但它不会强制用户实现所需的方法。
有什么我可以干净利落地做的事情,比如任何公共(public)可实现的东西吗?
这是结构:
API: IContext -> ContextControl -> (抽象方法)
模块DLL ContextControl(API) -> AppContextControl(重写方法)
主机应用程序拉取AppContextControl
我知道我可以告诉模块开发人员实现一个接口(interface)以及约束他们实现接口(interface)的 ContextControl,但编译器告诉他们会更专业。
在开发模块中,如果我不是从 ContextControl 继承,而是实现 IContext,那么我会丢失所有默认主体,并且模块开发必须实现更多内容。
干杯。
最佳答案
您所描述的两种方法 - 接口(interface)和抽象类 - 是(我确信您知道)执行您所描述的操作的推荐方法,至少,如果您想在编译时强制实现的话 -时间。
我知道的唯一其他方法是提供一个抛出 NotImplementedException()
的默认实现。不幸的是,这会给你一个运行时错误,但在编译时不会出现任何错误。
关于c# - 在 C# 中强制实现没有接口(interface)或抽象类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620446/