2012-03-06 8 views
6

Mamy projekt pełen komponentów niestandardowych, który dziś działa w Lazarus i Delphi.Jakie są różnice między implementacją interfejsów w Delphi i Lazarus (FPC)?

Mam na myśli interfejsy kodu, ale nie znam ich zbyt dobrze. Co chciałbym wiedzieć, to: Jakie są niuanse implementacyjne z interfejsów Delphi i Lazarus? Jest coś, co powinienem być szczególnie świadomy? Czy będę musiał kodować naprawdę różne rzeczy?

Wyjaśnienie: Myślę, że komponenty mogą korzystać z interfejsów, a przynajmniej więcej się z nich dowiem. Na przykład jeden z komponentów umożliwia komunikację z wieloma różnymi wersjami sprzętu za pomocą portu szeregowego. Ale użytkownik powinien używać tylko naszego komponentu do tworzenia aplikacji. Mamy zatem komponent i jedną klasę dla każdego z tych urządzeń potomnych z klasy bazowej. W czasie wykonywania tworzymy konkretną klasę wewnątrz komponentu.

Nie jestem pewien, czy to ostatnie wyjaśnienie było potrzebne, ale mogę napisać więcej, jeśli ktoś z was tego potrzebuje.

+2

Oto "podstawowe czytanie" (http://www.freepascal.org/docs-html/ref/refch7.html#x84-940007) na temat interfejsów w FreePascal. Jako bardzo szybką konkluzję powiedziałbym, że jeśli celujesz w platformę Windows i będziesz używał architektury Windows COM (interfejsów pochodzących od IUnknown), nie będzie różnicy w kodzie z Delphi, ale odpowiedź na twoje pytanie powinna być bardziej wyrafinowany. – TLama

+0

Co masz na myśli przez "niuanse implementacyjne"? To nie brzmi tak, jakby to miało dla ciebie znaczenie. Istotne byłoby, czy można napisać kod, który * oznacza * to samo dla obu kompilatorów, niezależnie od tego, jak każdy kompilator faktycznie implementuje interfejsy. –

+0

@DavidHeffernan Mam na myśli "małe różnice w implementacji". Może nie mogę napisać kodu, który oznacza to samo dla obu, ale być może, nie musiałbym pisać wszystkich rzeczy dla każdego kompilatora. Pytałem tylko o przyczynę, której oczekiwałem, ale nie wiem, czy w tym przypadku istnieją jakiekolwiek różnice w obu kompilatorach. Czy teraz jest to jaśniejsze? – EMBarbosa

Odpowiedz

11

W opcji Pascal typ interfejsu zależy od trybu. Zasadniczo istnieje tryb COM or CORBA. COM jest domyślny i mniej więcej kompatybilny z Delphi. CORBA jest prostszym przypadkiem bez liczenia odwołań. (i dlatego też nie generuje wywołań do przeliczania funkcji). Więc w zasadzie interfejs FPC Corba jest jak hipotetyczny przodek interfejsu IUnknown.

Poza tym czasami występują pewne różnice po wypuszczeniu interfejsów. Delphi ma tendencję do zmniejszania liczby sprawdzeń na końcu procedury lub bloku (w większych procedurach), podczas gdy FPC czasami zwalnia je wcześniej, zazwyczaj natychmiast po oświadczeniu o ostatnim użyciu. Oba są legalnymi opcjami wdrożeniowymi btw, na podstawie których zakres jest używany dla zmiennych tymczasowych. (tylko na poziomie funkcji lub w głębszych blokach zagnieżdżonych)

To czasami ujawnia ukryte (złe) założenia w kodzie, szczególnie gdy używane są odniesienia do interfejsu i odniesienia do obiektów w ramach jednej procedury, która może "przetrwać" w Delphi, ale nie w FPC. Jest to typowy przypadek, który pokazuje, że długo działający kod niekoniecznie jest poprawny. Można zauważyć tylko ukryte założenia podczas zmiany implementacji

(dodany później :) zauważ, że możesz użyć stylu COM na * nix. Jest to głównie wstawianie wywołań do procedur liczenia, które odróżniają dwa typy interfejsów. Nie jaki system (COM, Corba lub po prostu w odwołaniu do RTL), do których te połączenia są kierowane.

Należy zauważyć, że moim zdaniem nazwy COM i Corba dla obu typów interfejsów zostały źle wybrane. Interfejsy Corby są przeliczane właściwie, ale tradycyjnie ten refcount jest obsługiwany ręcznie, ponieważ Java nie obsługuje obsługiwanych zewnętrznie interfejsów w sposób zautomatyzowany.

+1

+1. Ten rodzaj informacji jest naprawdę doceniany. – EMBarbosa