实现所有类型的接口 实现另一个接口 C#

Implement interface for all types implementing another interface C#

提问人:Jack Maloney 提问时间:11/15/2023 最后编辑:Guru StronJack Maloney 更新时间:11/16/2023 访问量:87

问:

是否可以为在 C# 中实现另一个接口的所有类型实现一个接口?例如

interface A {
    void foo();
}

interface B {
    void bar();
}

现在我想为实现的所有类型提供一个实现。这可能吗?我想要的是,任何类型也将自动被视为 的实现者,即 。BAC:ABC:B

例如,这在 Rust 中被称为“impl trait for trait”。https://users.rust-lang.org/t/implementing-trait-for-trait/13810

C# .NET 特征

评论

1赞 Dai 11/15/2023
“想要提供 B 的实现”——你这是什么意思?
1赞 Dai 11/15/2023
做(所以每个也是一个),这是我对你帖子的解释的一个解决方案。interface A : B {}AB
1赞 Dai 11/15/2023
...或者 - 以便每个人都提供一个 (但返回的对象不一定与 - 共享对象标识,这可能是可取的,也可能是不可取的)。interface A { B ExposedB { get; } }ABBA

答:

2赞 Guru Stron 11/15/2023 #1

C# 不直接支持特征(至少在我对该主题的理解中),但您可以使用默认接口方法在某种程度上模拟它。在这种情况下,您可以使用显式默认接口实现,这将在一定程度上解决问题:

interface IA : IB {
    void Foo();
    void IB.Bar() => Console.WriteLine("B implemented in A");
}

interface IB {
    void Bar();
}

class MyAWithB : IA
{
    public void Foo()
    {       
    }
}

使用时需要强制转换为 或 :IAIB

var myAWithB = new MyAWithB();
// myAWithB.Bar() // will not compile
(myAWithB as IA).Bar(); // prints B implemented in A
(myAWithB as IB).Bar(); // prints B implemented in A

附言

就我个人而言,我不是这个功能的忠实粉丝,尽量不要在我的代码库中引入它,但可以说它可以有一些用途。

此外,还有一些有趣的讨论可以遵循@github与该主题有些相关的讨论: