gpt4 book ai didi

c# - 为接口(interface)强制执行某种类类型?

转载 作者:太空宇宙 更新时间:2023-11-03 17:21:46 24 4
gpt4 key购买 nike

我的一个应用程序中有几个控件,它们显然都扩展了 Control 类。

我需要其中的几个有一些共享接口(interface),所以我创建了一个涵盖共享功能的接口(interface)。

有什么方法可以强制我的接口(interface)只能提供给 Control 的子类吗?

即(伪)

interface IEmbed

class MyControl1 : Control, IEmbed

class MyControl2 : Control, IEmbed

class MyClass : IEmbed

理想情况下,我希望编译器在这里失败,因为 MyClass 尝试实现 IEmbed,即使它不是控件。

我是不是以错误的方式解决了这个问题,还是有办法强制执行此行为?

编辑

有人问我为什么要强制执行此行为。

我有一个方法,我想采用任何 IEmbed 实现并将其作为子控件添加到另一个元素。

这一切都很好,但是 Controls.Add() 拒绝接受 IEmbed 对象,因此无法编译。

我想如果我告诉编译器任何实现 IEmbed 的东西都必须是一个控件,它可能会起作用吗?

最佳答案

不,没有办法在编译时强制执行。

可以在运行时通过在将obj用作IEmbed<之前让您的框架代码测试obj是否为Control来强制执行它 实例。

更新:根据评论的反馈,看起来一个好的解决方案是从中间抽象类 EmbedControl : Control 继承并让您的方法接受 EmbedControl 而不是 IEmbed(在这种情况下,实际上不需要保留接口(interface),因为您可以简单地使用 abstract 方法基类)。

虽然上面的代码会很好地工作,但在某些情况下,强制“客户端”类的实现者从您自己的中间类派生是不可取的,即使您需要它们从“基”类派生 Control 同时。在这种情况下,另一个好的方法是使用泛型:

public void DoSomethingWithControl<T>(T control) where T : Control, IEmbed

关于c# - 为接口(interface)强制执行某种类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9868708/

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