覆盖==似乎无法在继承的类中工作

时间:2017-02-28 22:37:18

标签: c# inheritance operator-overloading

我正在开发一个程序,它是一个更大的程序的一部分,但我创建了这个简单的应用程序来演示我遇到的问题。这是我的代码:

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字段对于每个实例都是不同的,所以我不明白为什么它说它们是平等的。任何帮助,将不胜感激。我确信这是一件我很容易忽视的事情。

3 个答案:

答案 0 :(得分:3)

您获得了== operator Animal,因为AreEqual()正在对动物进行操作。此运算符不是继承的虚方法。如果你想要继承,你应该使用Equals()

答案 1 :(得分:1)

您正在重载的运算符对于它所属的类是静态的,静态的。

它与您希望的new关键字相似,而不是override关键字。

您可以详细了解新的vs覆盖here

基本上,执行的方法是基于你将它投射到的类型。您将两个对象都投射到<{p}内的Animal

private static void AreEqual(Animal animal1, Animal animal2)

所以Animal的==运算符被执行。

如果你这样做

Console.WriteLine(dog == dog2);

它将返回false。

答案 2 :(得分:0)

更改

response.addCookie(userName);

if (animal1 == animal2)