gpt4 book ai didi

c# - 可以转换为非继承的接口(interface)吗?

转载 作者:可可西里 更新时间:2023-11-01 08:15:55 24 4
gpt4 key购买 nike

为什么不能转换一个实例:

sealed class Foo
{
public void Go() { }
}

...到这个界面:

interface IBar
{
void Go();
}

...即使 Foo 具有 IBar 的签名?

如何将 Foo 的实例转换为 IBar?假设我无法控制 Foo

最佳答案

不,C# 不支持鸭子类型。

这个问题的 OOP 方法是使用 the Adapter Pattern .

你会这样做:

class FooBarAdapter : IBar {

private readonly Foo foo;

public FooBarAdapter(Foo foo) {

this.foo = foo;
}

public void Go() {

this.foo.Go();
}
}

每当你有一个 Foo 但需要一个 IBar 时,你可以按需包装它:

public void ContrivedScenario() {

Foo foo = GetFooFromExternalDependency();

FooBarAdapter adapter = new FooBarAdapter( foo );

this.NeedsIBar( adapter );
}

public void NeedsIBar(IBar bar) { ... }

我注意到如果 Foo-to-IBar 转换发生很多,你可以使用隐式转换,所以你不需要显式构造 FooBarAdapter 实例,但这是否是一个好的软件工程实践是值得商榷的:

class FooBarAdapter : IBar {

// (same as above)

public static implicit operator FooBarAdapter(Foo foo) {
return new FooBarAdapter( foo );
}
}

这样你就可以这样做:

public void ContrivedScenario() {

Foo foo = GetFooFromExternalDependency();

this.NeedsIBar( foo ); // the conversion from `Foo foo` to `FooBarAdapter` happens implicitly
}

C# 不支持 duck-typing 的一个原因是因为一个类的接口(interface)(在 OOP 意义上,不是字面意义上的 interface)与另一个类共享相同的标识符,并不意味着他们是兼容的。例如 Process.Kill(杀死进程)和 MegaDeathKillBot3000.Kill(杀死全人类)可能不应该互换使用......除非你真的 想要。

关于c# - 可以转换为非继承的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39782757/

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