[英]Overriding == does't seem to work in inherited class
我正在開發一個更大的程序的一部分,但是我創建了這個簡單的應用程序來演示我遇到的問題。 這是我的代碼:
using System;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
var bear = new Animal("Bear");
var bear2 = new Animal("Bear");
var dog = new Dog("Woof!", "Dog");
var dog2 = new Dog("Bow-Wow!", "Dog");
AreEqual(bear, bear2);
AreEqual(dog2, dog);
}
private static void AreEqual(Animal animal1, Animal animal2)
{
if (animal1 == animal2)
Console.WriteLine($"{animal1,15} == {animal2}");
else
Console.WriteLine($"{animal1,15} != {animal2}");
}
}
public sealed class Dog : Animal
{
public string Action { get; }
public static bool operator ==(Dog x, Dog y)
{
return x.Name == y.Name && x.Action == y.Action;
}
public static bool operator !=(Dog x, Dog y)
{
return !(x.Name == y.Name && x.Action == y.Action);
}
public override bool Equals(object obj)
{
if (!base.Equals(obj))
{
return false;
}
Dog rhs = (Dog)obj;
return Action == rhs.Action;
}
public override int GetHashCode()
{
return base.GetHashCode() ^ Action.GetHashCode();
}
public Dog(string action, string animalName) : base(animalName)
{
Action = action;
}
public override string ToString()
{
return $"{Name} ({Action})";
}
}
public class Animal
{
public string Name { get; }
public Animal(string animalName)
{
Name = animalName;
}
public static bool operator ==(Animal x, Animal y)
{
return x.Name == y.Name;
}
public static bool operator !=(Animal x, Animal y)
{
return x.Name != y.Name;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (ReferenceEquals(obj, this))
return true;
if (obj.GetType() != GetType())
return false;
Animal rhs = obj as Animal;
return Name == rhs.Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
public override string ToString()
{
return Name;
}
}
}
運行程序時,我在屏幕上看到了以下信息:
Bear == Bear
Dog (Bow-wow!) == Dog (Woof!)
這是不正確的。 我期望看到的是:
Bear == Bear
Dog (Bow-wow!) != Dog (Woof!)
在Dog
類中,我覆蓋了==
運算符,該運算符比較Name
字段和Action
字段。 顯然,每個實例的Action
字段都不同,所以我不明白為什么它說它們相等。 任何幫助,將不勝感激。 我敢肯定,這是我所忽略的簡單事情。
您正在獲得Animal
的== operator
,因為AreEqual()
正在對Animals進行操作。 此運算符不是繼承的虛擬方法。 如果要繼承,則應改用Equals()
您要重載的運算符是靜態的,它所屬的類是靜態的。
它具有與new
關鍵字類似的概念,而不是您希望的override
關鍵字。
您可以在此處閱讀有關新vs覆蓋的更多信息
基本上,方法的執行基於您強制轉換為的類型。 您正在將兩個對象都投射到Animal
里面
private static void AreEqual(Animal animal1, Animal animal2)
因此執行Animal
的==運算符。
如果你只是做
Console.WriteLine(dog == dog2);
它將返回false。
更改
if (animal1 == animal2)
至
if (animal1.Equals(animal2))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.