我正在开发一个程序,它是一个更大的程序的一部分,但我创建了这个简单的应用程序来演示我遇到的问题。这是我的代码:
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
字段对于每个实例都是不同的,所以我不明白为什么它说它们是平等的。任何帮助,将不胜感激。我确信这是一件我很容易忽视的事情。
答案 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)