gpt4 book ai didi

c# - 如何根据基类比较两个对象?

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:10 26 4
gpt4 key购买 nike

我希望能够比较从 C# 中的同一个抽象类派生的两个类。以下代码说明了我的问题。

我现在可以通过使 BaseClass 成为非抽象来修复代码,然后在 ToBassClass() 中返回一个 new BaseClass 对象。但难道就没有更优雅、更高效的解决方案吗?

abstract class BaseClass
{
BaseClass(int x)
{
X = x;
}

int X { get; private set; }

// It is probably not necessary to override Equals for such a simple class,
// but I've done it to illustrate my point.
override Equals(object other)
{
if (!other is BaseClass)
{
return false;
}

BaseClass otherBaseClass = (BaseClass)other;

return (otherBaseClass.X == this.X);
}

BaseClass ToBaseClass()
{
// The explicit is only included for clarity.
return (BaseClass)this;
}
}

class ClassA : BaseClass
{
ClassA(int x, int y)
: base (x)
{
Y = y;
}

int Y { get; private set; }
}

class ClassB : BaseClass
{
ClassB(int x, int z)
: base (x)
{
Z = z;
}

int Z { get; private set; }
}

var a = new A(1, 2);
var b = new B(1, 3);

// This fails because despite the call to ToBaseClass(), a and b are treated
// as ClassA and ClassB classes so the overridden Equals() is never called.
Assert.AreEqual(a.ToBaseClass(), b.ToBaseClass());

最佳答案

这取决于您要测试相等性的位置。清楚ClassAClassB在这个词的真正意义上,实例永远不会是“平等的”,所以重写Equals这样做实际上可能会导致您的代码中出现一些奇怪的错误。

但是如果你想根据特定标准比较它们,那么你可以实现一个特定的IEqualityComparer (或多个比较器)适合您的需求。

因此,在这种情况下,您将:

/// <Summary>
/// Compares two classes based only on the value of their X property.
/// </Summary>
public class ComparerByX : IEqualityComparer<BaseClass>
{
#region IEqualityComparer<BaseClass> Members

public bool Equals(BaseClass a, BaseClass b)
{
return (a.X == b.X);
}

public int GetHashCode(BaseClass obj)
{
return obj.X.GetHashCode();
}

#endregion

}

[编辑] 关于评论:

请注意,这与覆盖 Equals 没有任何关系方法。

但是您将能够像这样检查是否相等:

IEqualityComparer<BaseClass> comparer = new ComparerByX();
Assert.True(comparer.Equals(a, b));

乍一看这似乎不是什么好事,但它为您提供了几个优势:

a) 你可以拥有尽可能多的IEqualityComparer<T>随心所欲地实现。视情况而定,可能会发现您 Equals覆盖毕竟不是那么好。然后,您可能会因此而破坏所有代码。

b) 实际上有很多类使用IEqualityComparer<T>比较项目。

例如,您可能想使用 BaseClass作为字典中的键。在这种情况下,您将使用 Dictionary<Key,Value> 接受 IEqualityComparer<T> 的构造函数重载:

Dictionary<BaseClass, SomeOtherClass> dictionary 
= new Dictionary<BaseClass, SomeOtherClass>(new ComparerByX());

这样,字典将使用自定义的 ComparerByX在 key 查找期间。

此外,例如,如果您使用的是 LINQ,则可以检查 Distinct()方法示例。它还支持返回不同值的重载,但使用指定的自定义值进行比较 IEqualityComparer .

关于c# - 如何根据基类比较两个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1661690/

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