gpt4 book ai didi

c# - 在c#中强制执行没有接口(interface)或抽象类的方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:23 25 4
gpt4 key购买 nike

我正在创建一个模块化类型系统,一个应用程序(主机)将其他模块加载到一个通用的 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)可实现的东西吗?

这是结构:

应用程序接口(interface):IContext -> ContextControl -> (抽象方法)

模块动态链接库上下文控制(API)-> AppContextControl(覆盖方法)

宿主应用程序拉取的 AppContextControl

我知道我可以告诉模块开发人员实现一个接口(interface)以及这个约束他们实现接口(interface)的 ContextControl,但编译器告诉他们会更专业。

在 dev 模块中,如果我不是从 ContextControl 继承而是实现 IContext,那么我将丢失所有默认主体,并且模块 dev 必须实现更多。

干杯。

最佳答案

你所描述的两种方式——接口(interface)和抽象类——是(我相信你知道的)推荐的方式来做你所描述的事情,至少,如果你想在编译时强制实现——时间。

我知道的唯一其他方法是提供一个默认实现,它会抛出一个 NotImplementedException()。不幸的是,这会给你一个运行时错误,但在编译时没有任何错误。

关于c# - 在c#中强制执行没有接口(interface)或抽象类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com