2010-05-26 8 views
6

TList를 취하고 TList의 모든 요소에 대한 String 표현을 반환하는 함수를 작성하려고합니다. 당신이 그것에 TList<String>를 전달할 수 없습니다 제외 Delphi : 문자열이 객체가 아닙니다.

나는,이 잘 작동 그래서

function ListToString(list:TList<TObject>):String; 

같은 함수를 시도했다.

E2010 Incompatible types: 'TList<System.TObject>' and 'TList<System.string>' 

문자열은 Object가 아닙니다.

function StringListToString(list:TList<string>):String; 

이 유일한 솔루션 :이 문제를 해결하기 위해, 나는 두 번째 기능을 작성했습니다? 문자열을보다 '객체와 같은'것으로 취급하는 다른 방법이 있습니까?

비슷한 맥락에서 두 개의 TLists를 비교하는 '같음'함수를 작성하려고했습니다. 다시 나는 (아마도 제네릭을 사용하고 계십니까?)이 기능을 쓸 수있는 방법이 있나요 같은 문제

function AreListsEqual(list1:TList<TObject>; list2:TList<TObject>):boolean; 

로 실행 그래서 그것은 또한 TList<String>을 처리 할 수 ​​있습니까? 문자열과 객체를 모두 처리하는 코드를 만들 때 알아야 할 다른 트릭이나 '우수 사례'가 있습니까? 아니면 모든 기능에 대해 두 가지 버전을 생성합니까? 제네릭이 도움이 될 수 있습니까?

저는 Java 배경이지만 현재는 Delphi에서 작동합니다. 최근에 그들은 자바 세상 (또는 Java에서 복사 한 C# 세계)에서 Delphi에 많은 것을 추가하고있는 것으로 보입니다. equals()와 hashcode()를 TObject에 추가하고 제네릭 컬렉션 프레임 워크 등을 만드는 것. Strings를 사용할 수 없다면이 추가가 매우 실용적인 것인지 궁금합니다.

[편집 : 누군가가 TStringList를 언급했습니다. 나는 그것을 지금까지 사용했지만, 나는 TList에 대해 묻고있다. 내가 (문자열을 포함한) 모든 것을 사실상 TList를 사용하여 갈 수있는 청소기 방법입니다 경우 해결하려고 노력하고 있습니다.]

+5

'TList '을 지원하는데 많은 노력을 기울이지는 않을 것입니다. 아무도 그것을 사용하지 않습니다. [TStringList']보다 열등합니다 (http://stackoverflow.com/questions/279471/tstringlist-vs-tliststring). 다른 곳에서 당신의 노력에 집중하십시오. –

+0

TList 의 stringrepresentation은 어떤 모양입니까? –

답변

7

귀하의 문제는 (그들이 비록) stringTObject 그것이 TList<x>을 것을의, 호환되지 않는 종류가 아니다 및 TList<y>xy이 아닌 경우에도 호환되지 않는 유형입니다. 이유는 복잡하지만 기본적으로 이렇게됩니다.

사용자의 기능이 TList<TObject>으로 받아 들여지고 TList<TMyObject>으로 전달되었다고 가정합니다. 그러나 귀하의 기능에서 당신은 TIncompatibleObject을 목록에 추가했습니다. 함수 시그니처는 TObjects 목록으로 작업한다는 것을 알고 있기 때문에 작동하고 갑자기 불변성을 위반하게됩니다. 그리고 그 목록을 열거하고 내부의 TMyObject 인스턴스를 사용하려고하면 무언가가 폭발 할 것입니다.

델파이 팀이 제네릭 형식에 대한 공분산 및 반항에 대한 지원을 추가 한 경우이 같은 작업을 안전하게 수행 할 수 있지만 불행히도 아직 익숙하지 않았습니다. 바라기를 우리는 곧 보게 될 것이다.

그러나 원래 질문으로 돌아가려면 문자열 목록을 비교하려면 제네릭을 사용할 필요가 없습니다. 델파이는 당신이 사용할 수있는 Classes 유닛에있는 TStringList라는 특정 list-of-strings 클래스를 가지고 있습니다. 문자열 처리에는 텍스트, CommaText 및 DelimitedText 속성 등 모든 문자열을 단일 문자열로 연결하는 세 가지 방법을 비롯하여 많은 기본 제공 기능이 있습니다.

+1

TlogList가 아닌 TList 에 대한 이야기입니다. D2010 이전에는 TStringList를 사용했지만보다 통일 된 API (즉, TList)를 사용하여 뭔가를 쓰려고합니다. 나는 내 질문을 편집 할 것이다. – awmross

+0

그래서 ListList 함수에 TList 을 전달할 수 없습니다. 내가 참조! ListToString의 함수 서명을 쓰는 다른 방법이있어'TList '을 전달할 수 있습니까? – awmross

+2

@awmross : 글쎄, 함수 자체를 제네릭 형식으로 지정할 수 있습니다. 'function ListToString (목록 : TList ) : String;'그건 효과가 있습니다. 그러나 컴파일러는 T의 특성에 대해 아무 것도 생각할 수 없으므로이를 객체로 취급 할 수 없습니다. (클래스 제약 조건이나 특정 클래스 제약 조건을 T에 두지 않으면 문자열을 사용할 수 없습니다.) 기본적으로 제네릭은 유용하지만 모든 것에 대한 최종 답이 아닙니다. –

0

깨끗하지 않습니다. 더 심하다. TStringList 대신 TList<String>을 사용하는 것은 근본적으로 나쁜 생각입니다.

"나는 어디에서나 제네릭을 사용합니다"라고 말하는 것이 더 깨끗합니다. 사실, 일관성을 유지하려면 아무데도 사용하지 마십시오. 델파이 개발자들이 피하는 것처럼, 피하십시오. 역병처럼.

VCL의 문자열 목록은 모두 TStringList 유형입니다. 대부분의 델파이 애플리케이션에서 대부분의 객체 컬렉션은 템플리트 형식 대신 TObjectList를 사용합니다.

Delphi 플랫폼 전체와 일관성이 부족하고 이상한 점을 골라 내고, 당신과 당신이 될 때 그것을 표준화하고, 이상한 일을하는 것이 더 깨끗하고 일관성있는 것은 아닙니다.

실제로 제네릭이 무겁게 사용하는 것이 안전한지 확실하지 않습니다.

TList를 사용하기 시작하면 TStringList 인 Memo.Lines에 깨끗하게 복사 할 수 없으며 형식 비 호환성이 생겨 아무 것도 만들지 않을 것이며 추가 기능을 잃어 버리게됩니다. TStringList. TStringList.Text를 사용하는 대신 직접 작성해야합니다. 당신은 또한 LoadFromFile과 SaveToFile과 더 많은 것을 잃게됩니다. 문자열 배열은 델파이에서 유비쿼터스이며, 거의 항상 TStringList입니다. TList<String>은 절름발이입니다.

+1

기존 라이브러리와의 상호 운용성은 확실히 고려해야 할 사항입니다. TStringList와의 불일치는 String 이외의 다른 List를 원한다면 TStringList와 완전히 호환되지 않는 무언가를 사용해야한다는 사실에 있습니다.g TObjectList). – awmross

+0

잘못하고 있습니다. Delphi 문자열 유형은 기본 유형입니다. 당신이 그것들을 사물이되기를 원하는 것처럼 들리네. 그러나 그들은 그렇지 않습니다. 정수는 일종의 객체가 아닙니다. 그것으로 살아가는 법을 배웁니다. –

+0

java의 모든 유형이 일반적인 루트를 가지고 있지 않다. –

1

비록 최적의 상태는 아니지만 문자열 래퍼 클래스를 만들 수 있습니다. 문자열에 작동하는 몇 가지 유용한 함수가 추가 될 수 있습니다. Here은 예제 클래스로, these methods을 사용하는 등 메모리 관리를 쉽게하기 위해 향상되어야합니다.

나는 당신의 문제에 대한 해결책만을 제안하고있다. 일관성을 위해 일관성을 유지하면 코드가 더 좋아질 것이라는 것에 동의하지 않는다. 필요하면 Delphi 오브젝트 파스칼이 선택 언어가 아닐 수도 있습니다.

관련 문제