gpt4 book ai didi

c# - 实现IEquatable时隐藏基类方法

转载 作者:行者123 更新时间:2023-11-30 22:04:07 30 4
gpt4 key购买 nike

我正在寻找实现 IEquatable<T> 的最佳方式以这样一种方式,类型检查是隐式的。如果我调用 Equals在子类中,我想确保我要比较的类型是相同的。请参阅下面的精简示例。

两个 Child1如果对象的 ID 相同,则对象应被视为相等。在此示例中,调用 child1.Equals(child2)如果他们的 ID 相同,将返回 true,这不是预期的行为。我基本上想强制实例 Child1使用 Equals 的重载这需要 Child1参数,而不仅仅是派生自与 Child1 相同的基类的参数.

我开始认为我是以错误的方式处理这个问题的。也许我应该离开 Equals 的实现在基类中,并确保 this.GetType() == other.GetType()

  public abstract class BaseClass : IEquatable<BaseClass>
{
public int ID { get; set; }

public bool Equals(BaseClass other)
{
return
other != null &&
other.ID == this.ID;
}
}

public sealed class Child1 : BaseClass
{
string Child1Prop { get; set; }

public bool Equals(Child1 other)
{
return base.Equals(other as BaseClass);
}
}

public sealed class Child2 : BaseClass
{
string Child2Prop { get; set; }

public bool Equals(Child2 other)
{
return base.Equals(other as BaseClass);
}
}

最佳答案

如果您真的需要“强制 Child1 的实例使用需要 Child1 参数的 Equals 重载”,您可以这样做与 C# Generics :

public abstract class BaseClass<T> : IEquatable<T>
where T : BaseClass<T>
{
public int ID { get; set; }

public bool Equals(T other)
{
return
other != null &&
other.ID == this.ID;
}
}

public sealed class Child1 : BaseClass<Child1>
{
string Child1Prop { get; set; }

public bool Equals(Child1 other)
{
return base.Equals(other);
}
}

public sealed class Child2 : BaseClass<Child2>
{
string Child2Prop { get; set; }

public bool Equals(Child2 other)
{
return base.Equals(other);
}
}

这确保您的“等于”方法只能使用其定义的类型调用。

关于c# - 实现IEquatable时隐藏基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451741/

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