簡體   English   中英

覆蓋==在繼承的類中似乎不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM