TObjectList와
내가 정의 TSocket
유형을 구현하여 시작하고 같은 유형 TObjectList<TSocket>
의 목록에서 사용하려고 : 내가 기대
list := nil;
socket := nil;
try
list := TObjectList<TSocket>.Create();
socket := TSocket.Create(TIpAddress.Parse('127.0.0.1'),6857);
// add new socket object with equal values to list
list.Add(TSocket.Create(TIpAddress.Parse('127.0.0.1'),6857));
// should return true but returns false
if list.Contains(socket) then
WriteLn('socket contained in list')
else
WriteLn('socket not contained in list');
// should return number 0 but returns -1
if list.IndexOf(socket) = 0 then
WriteLn('socket contained in list')
else
WriteLn('socket not contained in list');
// should remove item from list but items doesn't get removed
list.Remove(socket);
finally
list.Free();
socket.Free();
그 Contains
, IndexOf
및 TMyObject
의 Equals
절차의 Remove
메이크업 사용과 이 절차의 구현을 덮어 씁니다. , IndexOf
true를 반환해야 Contains
false를 반환하지만,이 코드를 사용하여
type
TSocket = class
strict private
_ipAddress: TIpAddress;
_port: integer;
public
constructor Create(ipAddress: TIpAddress; port: integer);
function GetIpAddress: TIpAddress;
function GetPort: integer;
property IpAddress: TIpAddress read GetIpAddress;
property Port: integer read GetPort;
function Equals(other: TObject): boolean; overload; override;
destructor Destroy; override;
end;
implementation
constructor TSocket.Create(ipAddress: TIpAddress; port: integer);
begin
inherited Create();
_ipAddress := ipAddress;
_port := port;
end;
function TSocket.Equals(other: TObject): boolean;
var
otherSocket: TSocket;
begin
if not (other is TSocket) then exit(false);
otherSocket := other as TSocket;
result:= (_ipAddress.Equals(otherSocket.IpAddress)) and (_port = otherSocket.Port)
end;
function TSocket.GetIpAddress: TIpAddress;
begin
result := _ipAddress;
end;
function TSocket.GetPort: integer;
begin
result := _port;
end;
destructor TSocket.Destroy;
begin
_ipAddress.Free();
inherited Destroy();
end;
-1 만 0 Remove
개체를 제거하지 않고 그것을 제거해야해야한다 : 그러므로 나는 내 TSocket 클래스에 Equals
의 다음 된 구현에 추가 . 나는이 방법들이 그들이하지 않은 TSocket
의 Equals
방법을 사용할 것이라고 기대했다. 문서를 읽은 후에 나는 TObjectList
의 생성자가 IComparer의 구현과 함께 호출 될 수 있다는 것을 알아 냈습니다. 따라서 내 Equals
메서드를 사용하기 위해 TEqualityComparer<TSocket>
을 구현했습니다. 불행히도 TObjectList
의 생성자는 IEqualityComparer
인터페이스를 지원하지 않지만 대신 IComparer
인터페이스를 사용합니다.
질문 : 어떻게 델파이에서 사용자 정의 형식을 사용할 때이 Contains
, Remove
또는 TObjectList<T>
의 IndexOf
같은 방법을 사용합니까? 다른 프로그래밍 언어 (예 : Java 또는 C#)에서는 목록 유형의 객체를 비교하는 데 Equals
이 사용됩니다. Delphi는 객체를 비교하기 위해 어떤 메커니즘을 사용합니까?
업데이트 종합적인 의견을 보내 주셔서 감사합니다. 내 질문과 코드를 적절하게 업데이트했습니다. 코드를 실행할 때 내 기대가 무엇인지 정교하게하고 내 의도를 명확하게하기 위해 추가 코드를 추가했습니다. @DavidHeffernan : 구현이 잘못되었습니다. 참조 계산에 대해 더 자세히 알아보기 위해 TInterfacedObject에 상속을 추가했습니다. 코드에서 TInterfacedObject를 제거했습니다.
큰 문제는 참조 계산 된 인터페이스와 개체를 혼합하는 것입니다. 너는 그걸 막아야 해. 여기 코드의 모든 부분은 잘못되었습니다. 'Contains','Remove','IndexOf'는 이미 타입으로 잘 작동하지만 잘못된 타입을 사용하고 있으므로 다시 시작해야합니다. –
죄송합니다. 코드 품질이 좋지 않으면 언어를 배우려고합니다. – MUG4N
문제는 우리가 대답 할 수 있지만 도움이되지 않습니다. 문제는 더욱 심각합니다. 당신은 참조 계산 된 인터페이스를 사용하도록 선택했고 그것에 충실해야합니다. –