重写的运算符不起作用
overrided operator doesn't work
我已经创建了自定义链表 class。在这个 class 我有
public bool Contains( Object obj )
{
for( Node curr = Start; curr != null; curr = curr.Next)
{
if( curr.Data == obj )
return true;
}
return false;
}
在 Workman.cs 中我重写了 == 运算符:
class Workman
{
public DateTime Date { get; set; }
public string LastName { get; set; }
public string PartCode { get; set; }
public int PartCount { get; set; }
public int DaysWorked { get; set; }
public int PartsMade { get; set; }
public double PriceSum { get; set; }
public Workman(DateTime date, string lastName, string partCode, int partCount)
{
Date = date;
LastName = lastName;
PartCode = partCode;
PartCount = partCount;
}
public Workman() { }
public override string ToString ()
{
return string.Format ("[Workman: LastName={0}, PartCode={1}, PartCount={2}", LastName, PartCode, PartCount);
}
public override bool Equals (object obj)
{
return this.Equals (obj as Workman);
}
public bool Equals(Workman workman)
{
if(Object.ReferenceEquals(workman, null))
return false;
if(this.GetType() != workman.GetType())
return false;
return (LastName == workman.LastName);
}
public override int GetHashCode()
{
return LastName.GetHashCode();
}
public static bool operator ==(Workman lhs, Workman rhs)
{
if(Object.ReferenceEquals(lhs, null))
{
if(Object.ReferenceEquals(rhs, null))
{
return true;
}
return false;
}
return lhs.Equals(rhs);
}
public static bool operator !=(Workman lhs, Workman rhs)
{
return !(lhs == rhs);
}
}
现在主要我有:
LinkedList test = new LinkedList();
test.Add2( new Workman(new DateTime(), "John", "whatever", 45));
test.Add2( new Workman(new DateTime(), "Mike", "bb", 45));
Workman work = new Workman( new DateTime(), "Mike", "bb", 45 );
if( test.Contains( work ))
{
Console.WriteLine("Contains");
}
这行不通。当我尝试调试时,Linkedlist.cs class if( curr.Data == obj)
中的行没有在 Workman.cs 中输入覆盖代码。我怎样才能使这项工作?
您不能覆盖 操作符,您只能重载 它们。您正在使用 object
参数调用 ==
运算符重载,而不是使用 Workman
参数调用新的重载。
我建议您改用 object.Equals
,因为您已经覆盖了
if(Equals(cur.Data, obj)
{
return true;
}
我认为如果您添加演员表,它会为您工作,因为现在您正在对对象调用 ==。
我相信这会奏效:
public bool Contains( Object obj )
{
for( Node curr = Start; curr != null; curr = curr.Next)
{
if(curr.data is workman && obj is workman)
{
if((workman)curr.data == (workman)obj )
{
return true;
}
else
{
return false;
}
}
if( curr.Data == obj )
{
return true;
}
}
return false;
}
我不是 100% 确定,如果对您有帮助,请告诉我。
谢谢。
我已经创建了自定义链表 class。在这个 class 我有
public bool Contains( Object obj )
{
for( Node curr = Start; curr != null; curr = curr.Next)
{
if( curr.Data == obj )
return true;
}
return false;
}
在 Workman.cs 中我重写了 == 运算符:
class Workman
{
public DateTime Date { get; set; }
public string LastName { get; set; }
public string PartCode { get; set; }
public int PartCount { get; set; }
public int DaysWorked { get; set; }
public int PartsMade { get; set; }
public double PriceSum { get; set; }
public Workman(DateTime date, string lastName, string partCode, int partCount)
{
Date = date;
LastName = lastName;
PartCode = partCode;
PartCount = partCount;
}
public Workman() { }
public override string ToString ()
{
return string.Format ("[Workman: LastName={0}, PartCode={1}, PartCount={2}", LastName, PartCode, PartCount);
}
public override bool Equals (object obj)
{
return this.Equals (obj as Workman);
}
public bool Equals(Workman workman)
{
if(Object.ReferenceEquals(workman, null))
return false;
if(this.GetType() != workman.GetType())
return false;
return (LastName == workman.LastName);
}
public override int GetHashCode()
{
return LastName.GetHashCode();
}
public static bool operator ==(Workman lhs, Workman rhs)
{
if(Object.ReferenceEquals(lhs, null))
{
if(Object.ReferenceEquals(rhs, null))
{
return true;
}
return false;
}
return lhs.Equals(rhs);
}
public static bool operator !=(Workman lhs, Workman rhs)
{
return !(lhs == rhs);
}
}
现在主要我有:
LinkedList test = new LinkedList();
test.Add2( new Workman(new DateTime(), "John", "whatever", 45));
test.Add2( new Workman(new DateTime(), "Mike", "bb", 45));
Workman work = new Workman( new DateTime(), "Mike", "bb", 45 );
if( test.Contains( work ))
{
Console.WriteLine("Contains");
}
这行不通。当我尝试调试时,Linkedlist.cs class if( curr.Data == obj)
中的行没有在 Workman.cs 中输入覆盖代码。我怎样才能使这项工作?
您不能覆盖 操作符,您只能重载 它们。您正在使用 object
参数调用 ==
运算符重载,而不是使用 Workman
参数调用新的重载。
我建议您改用 object.Equals
,因为您已经覆盖了
if(Equals(cur.Data, obj)
{
return true;
}
我认为如果您添加演员表,它会为您工作,因为现在您正在对对象调用 ==。 我相信这会奏效:
public bool Contains( Object obj )
{
for( Node curr = Start; curr != null; curr = curr.Next)
{
if(curr.data is workman && obj is workman)
{
if((workman)curr.data == (workman)obj )
{
return true;
}
else
{
return false;
}
}
if( curr.Data == obj )
{
return true;
}
}
return false;
}
我不是 100% 确定,如果对您有帮助,请告诉我。 谢谢。