【问题标题】:is overriding's effect temporary or permanently?覆盖的效果是暂时的还是永久的?
【发布时间】:2020-05-31 20:13:06
【问题描述】:

我在我的一个程序中编写了这些代码行,用于将类的两个实例之间的相等比较从它们的引用更改为它们的值:

public interface IEquatable<Clock>
{

}
public bool Equals(Clock theObj)
{
    if (theObj == null)
    {
        return false;
    }
    if (theObj.ToString() == this.ToString())
    {
        return true;
    }
    else
    {
        return false;
    }
}

public override bool Equals(object obj)
{
   if (obj == null)
    {
        return false;
    }
    Clock clck = obj as Clock;
    if (clck == null)
    {
        return false;
    }
    else
    {
        return Equals(clck);
    }
}
public override int GetHashCode()
{
    return Hours;
}`

现在,当我尝试在不同解决方案中的不同项目中使用“Equals(T)”方法比较一个类的两个实例时,它会比较它们的值而不是它们的引用。

覆盖项目中的方法会影响其他项目中的方法吗?

我的完整代码是: `使用系统; 使用 System.Diagnostics.Contracts; 使用 System.Runtime.InteropServices.WindowsRuntime; 使用 System.Security.Cryptography.X509Certificates;

public class Clock
{
    public int Minutes;
    public int Hours;
    public interface IEquatable<Clock>
    {

    }
    public bool Equals(Clock theObj)
    {
        if (theObj == null)
        {
            return false;
        }
        if (theObj.ToString() == this.ToString())
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public override bool Equals(object obj)
    {
       if (obj == null)
       {
           return false;
       }
       Clock clck = obj as Clock;
       if (clck == null)
       {
           return false;
       }
       else
       {
           return Equals(clck);
       }
   }
   public override int GetHashCode()
   {
       return Hours;
   }
   public override string ToString()
   {
       if (Hours < 10)
       {
           if (Minutes < 10)
           {
               return "0" + Hours + ":0" + Minutes;
           }
           else
           {
               return "0" + Hours + ":" + Minutes;
           }
       }
       else
       {
           if (Minutes < 10)
           {
               return Hours + ":0" + Minutes;
           }
           else
           {
               return Hours + ":" + Minutes;
           }
       }
   }
   public Clock(int hours, int minutes)
   {
       while (minutes > 59 || minutes < 0)
       {
           if (minutes > 59)
           {
               minutes -= 60;
               hours++;
           }
           if (minutes < 0)
           {
               minutes += 60;
               hours--;
           }
       }

       while (hours > 23 || hours < 0)
       {
           if (hours > 23)
           {
               hours -= 24;
           }

           if (hours < 0)
           {
               hours += 24;
           }
       }
       Hours = hours;
       Minutes = minutes;
   }

   public Clock Add(int minutesToAdd)
   { 
       var res = new Clock(Hours , Minutes + minutesToAdd);
       return res;
   }

   public Clock Subtract(int minutesToSubtract)
   {
       var res = new Clock(Hours , Minutes - minutesToSubtract);
       return res;
   }}

感谢您的宝贵时间!

【问题讨论】:

  • 想象一下它改写成这样:“如果我在库 A 中编写一个类/方法,那么该类/方法可以在库 B 中使用吗?” - Equals 只是以某种类型定义(或覆盖)的方法,因此适用相同的规则。
  • 另外,代码示例顶部显示的接口定义是..不正确的。重新验证如何实现接口,并确保发布编译代码。

标签: c# class methods overriding equals


【解决方案1】:

您的Equals 方法的逻辑是错误的!对于没有ToString 方法覆盖的类,输出类似于StackOverflowCodes.Clock,这导致所有对象都相等! 请查看以下代码以获取更多想法:

public class Clock : IEquatable<Clock>
{
    public int Hours { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }

    public bool Equals(Clock c)
    {
        if (c == null)
            return false;
        // Here is a somewhat correct logic for equality (sort of ...)
        //return c.Hours == Hours && c.Minutes == Minutes;
        return c.ToString() == this.ToString();
    }
    public override int GetHashCode() => Hours * 3600 + Minutes * 60 + Seconds;
    public override bool Equals(object obj)
    {
        var clock = obj as Clock;

        if (clock != null)
            return Equals(clock);
        return false;
    }

    public static void Main()
    {
        Clock c2 = new Clock { Hours = 12, Minutes = 01, Seconds = 59 };
        var c1 = new Clock { Hours = 12 };

        Console.WriteLine(c1.Equals(c2));
        Console.WriteLine(Equals(c1, c2));
        Console.WriteLine(c1 == c2);

        Console.WriteLine(c1.ToString());
        Console.WriteLine(c2.ToString());
    }

对于您的问题,如果您引用具有您定义的 Clock 类型的项目/解决方案,那么您使用的是您定义的自定义逻辑,否则它们不应该有任何共同点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多