- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我希望能够比较从 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());
最佳答案
这取决于您要测试相等性的位置。清楚ClassA
和 ClassB
在这个词的真正意义上,实例永远不会是“平等的”,所以重写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/
我想知道以下方面的表现: 对比 我的猜测是 class比 CssClass 快因为 .net 可能不会对 class 做任何事情.另一方面,它必须对 CssClass 做一些工作。把它变成clas
我发现 Haskell Data.Vector.*错过 C++ std::vector::push_back的功能。有grow/unsafeGrow ,但它们似乎具有 O(n) 复杂度。 有没有办法在
我有实现了 MVC 模式的 WinForms 应用程序,其中模型从 View (表单)异步运行(backgroundWorker 线程)。 View 订阅了从 Model 引发的几个事件。 现在我需要
我正在尝试创建一个可以与同一类的实例或 String 进行比较的类。 例如,考虑以下内容: public class Record implements Comparable { public
我经常使用 CopyOnWriteArrayList。 线程执行大量读取 线程执行一些写操作 但是,我将在 Collections.synchronizedList() 时使用 线程执行一点读取 线程
CSS 的 WPF 类比是什么 em单位? 最佳答案 这是我做的。创建了一个 MarkupExtension,它根据在 Window 上分配的字体将字体大小转换为 EM。 我要感谢 http://10
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
有关 Microsoft 最近发布的文档 ReactXP目前没有太多关于 RX.Component 类的信息。 这是文档中的示例: class HelloWorld extends RX.Compon
我想用 Objective-C 为我的框架编写单元测试,它是用 swift 编写的。有没有办法从 Objective-C 测试访问框架的内部 API? 最佳答案 如果你有一个类 Foo 并且你想使用内
如何在 Common Lisp 中创建一个连续数字的列表? 也就是说,在 Common Lisp 中,Python 的 range 函数等价于什么? 在 Python 中,range(2, 10, 2
作为我的项目的一部分,我将 cshtml 脚本部分分离到它自己的文件中。除了一行之外,大部分都成功了。最初, View 文件的脚本部分包含以下行: "sAjaxSource": "@Url.Actio
我正在阅读 Android 文档,在 TextUtils 中看到了一些我通常在 String 类中使用的熟悉方法,并且我还发现方法 String.split(String regex) 已被删除,但存
HTML 的类比是什么?用于添加外部 javascript 的标记,将 C# 脚本添加到 XAML? 最佳答案 它的工作方式并不完全相同。您可以使用 Silverlight 的 Javascript
有谁知道用于 Word/Access VBA 的用户中断 Ctrl+Break 的任何处理程序? 有一个非常有用的处理程序 Application.EnableCancelKey = xlErrorH
Swift 4.2 有一个特殊条件 canImport这有助于开发人员检查是否可以在项目中导入模块。它是在 Swift 4.1 中引入的。 现在我正在开发用 Objective-C 编写的 iOS 项
我是一名优秀的程序员,十分优秀!