如果您想避免混乱和重复的转换,您可以添加一个将类型转换为接口的属性:
public class MyClass : ILoggable
{
ILoggable AsILoggable => (ILoggable)this;
void MyMethod()
{
AsILoggable.Log("Using injected logging");
}
}
但这是关闭的。这似乎是错误的,无论它是如何完成的。从文档中:
最常见的场景是将成员安全地添加到已被无数客户端发布和使用的接口中。
当有人担心在接口中实现实现时——以前没有实现——这就是说得通的句子。这是一种在不破坏已经实现它的类的情况下添加到接口的方法。
但是这个问题意味着我们正在修改类以反映对其实现的接口的更改。这与该语言功能的所述用例完全相反。
如果我们已经在修改类,为什么不直接实现方法呢?
public void Log(string message) => DoSomethingWith(message);
当我们添加一个默认接口实现时,我们为接口的消费者提供了一个实现——依赖于抽象的类。
如果我们依赖于实现接口的类中的默认接口实现,那么对接口的更改实际上就是对类的内部实现的更改。这不是接口的用途。接口代表面向外部的行为,而不是内部实现。
就好像该类正在超越自身,以外部消费者的身份回顾自身,并将其用作其内部实现的一部分。该类不实现接口,但它依赖于它。这很奇怪。
我不会说这是错误的,但感觉就像是在滥用该功能。