【问题标题】:Can an interface be retroactively implemented in VB.NET?可以在 VB.NET 中追溯实现接口吗?
【发布时间】:2012-07-07 06:36:48
【问题描述】:

是否可以定义一个接口(例如 MyClass 实现 MyInterface),其方法/属性定义已经与第三方(或本机)类上定义的某些方法/属性匹配?

例如,DataRow 类具有许多使其“类似于行”的属性/方法。如果我想实现一个接口(即 IRowLike),它定义了本机 DataRow 类(我不能直接触摸或扩展)上已经存在的某些方法和属性,该怎么办?我只是希望该类在运行时同意它确实遵守某些接口。

界面提供了穷人版的“鸭子打字”。一旦我有了一组都遵守给定接口的类,我就可以针对该接口定义扩展方法,并且所有支持该接口的类都会立即获得新的行为。我知道想要对第三方类追溯应用接口可能看起来很奇怪,但它肯定可以让我们用更少的代码做更多的事情。

【问题讨论】:

    标签: vb.net interface metaprogramming


    【解决方案1】:

    这在 .Net 中是不可能的。类型定义了它在编译时在元数据中实现的接口,并且它的定义在运行时不可更改。可以在运行时生成实现特定接口但不改变现有类型的类型

    虽然有一些选择。在 VB.Net 中,您可以简单地选择对类型使用后期绑定并以这种方式访问​​接口方法(或 C# 中的 dynamic)。当然,缺点是代码不是静态可验证的。

    【讨论】:

    • 本店需要静态绑定。谢谢你的信息。 :)
    • 有趣的是现有的类型实际上并没有被改变。我们所做的只是说这种类型与这个接口一致。它实际上并没有改变该类型的实现。
    • 不幸的是,这是因为我不能让一个类追溯订阅一个接口,我最终会针对所有有意义的类型编写相同扩展方法的变体。将它与对许多类型(在我们的例子中是用户控件)有意义的 3 或 4 种其他方法相乘,你最终会一遍又一遍地编写相同的逻辑。如果可以使类追溯地同意接口,则可以消除所有这些重复。我的意思是,什么是接口而不是合约?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多