gpt4 book ai didi

c# - 在 .NET 4.0 中是否有更优雅的方法来执行此操作?

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

似乎 C# 4.0 不支持覆盖参数的协方差(使用“in”关键字);是这样吗?

如果是这样,有没有更优雅的方法来做到这一点?

背景

public interface IBaseEvent { /* ... */ }

public interface IDerivedEvent : IBaseEvent { /* ... */ }

public class MoreDerivedEvent : IDerivedEvent { /* ... */ }

我有一组处理 MoreDerivedEvent 的类.由于事件处理代码的限制,我只能为 MoreDerivedEvent 注册一个事件处理程序。 ,而且我不知道它会将注册接口(interface)作为事件处理(我不相信它会,因为指导是显式使用类)。因此,为了适本地处理事件,我将处理程序定义如下:
public class BaseType
{
protected virtual void Handle(IBaseEvent @event) { /* Do Base Stuff */ }
}

public class DerivedType
{
protected virtual void Handle(IDerivedEvent @event)
{
/* Do Derived Stuff */
Handle((IBaseEvent)@event);
}

protected override sealed void Handle(IBaseEvent @event)
{
base.Handle(@event);
}
}

这显然不能提供真正的继承,我可能只会展平派生自 DerivedType 的类型。和 BaseType如果我不能解决这个问题。但我想我会先把它放到 Stack Overflow 社区。

最佳答案

首先,参数类型协方差不是类型安全的。假设我们允许参数类型协方差:

class B 
{
public virtual void Frob(Animal a)
{
}
}
class D : B
{
public override void Frob(Giraffe g)
{
}
}
....
B b = new D();
b.Frob(new Tiger()); // Calls D.Frob, which takes a giraffe.

不,协方差根本不是你想要的。这是不安全的。您需要返回类型的协方差,而不是参数类型。在您想要逆变的参数类型上:
class B 
{
public virtual void Frob(Giraffe g)
{
}
}
class D : B
{
public override void Frob(Animal a)
{
}
}
....
B b = new D();
b.Frob(new Giraffe()); // Calls D.Frob, which takes any animal.

那里没问题。

不幸的是,C# 既不支持返回类型协变也不支持参数类型逆变。对不起!

关于c# - 在 .NET 4.0 中是否有更优雅的方法来执行此操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4140097/

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