Deklaracja i implementacja Interfejsu

Odpowiedz Nowy wątek
2011-08-25 16:23
0

Czytałem artykuły na stronie ale wciąż nie mogę pojąć, być może ktoś na moim przykładzie, niczym młotem wtłucze mi to do głowy.
Mój interface zaprojektowany zgodnie z przykładem na stronie:

unit i_kstext;
 
interface
 
uses Classes;
 
type T2DArray = array of array of string;
 
type
  IKStext = Interface
 
  function getHeaderColumnNames():TStringList;
  function getSingleHeaderColumnName(lp: integer):String;
 
  End;
 
implementation
 
end.

Oraz moja klasa implementująca owy interface (bez zaimplementowanych funkcji):

unit main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, i_kstext;
 
type
  Tf_main = class(TForm, IKStext)
    b_chose_file: TButton; 
    procedure b_chose_fileClick(Sender: TObject);    
 
  private
    { Private declarations }
  public
 
  end;
 
  function getFilePath():string;
 
var
  f_main: Tf_main;
 
implementation
 
{$R *.dfm}
 
  function getFilePath():string;
  var TF: TextFile;
 
  begin
    if f_main.odChoseFile.Execute then
      begin
        Result := f_main.odChoseFile.FileName;
      end;
  end;
end.

I oto kod moich funkcji:

function getHeaderColumnNames():TStringList;
begin
(bla bla, nieistotny ciag znakow)
end;
 
function getSingleHeaderColumnName():TStringList;
begin
(bla bla, nieistotny ciag znakow)
end;

Mógłbym prosić o zabawienie się w puzzle i wstawienie właściwych fragmentów na swoje miejsca oraz ewentualne poprawienie składni?

edytowany 6x, ostatnio: madmike, 2011-08-25 16:46
NIE NADUŻYWAJ POGRUBIANIA!!! To się aż przykro czyta... - madmike 2011-08-25 16:46
bez żartów. użyłem pogrubienia bo uwagi zlewają się z kodem - JacekKw 2011-08-25 17:40

Pozostało 580 znaków

2011-08-25 18:31
2

I znowu Ty?

Posłuchaj mnie uważnie: Wczoraj bodajże pytałeś się czemu nie możesz przypisać jednej tablicy drugiej, a dzisiaj ZNOWU pytasz? No chyba coś jest nie tak. Nie żebym mówił że coś złego jest w pytaniu, ale zanim zapytasz:
1.EKSPERYMENTUJ
2.EKSPERYMENTUJ
3.SZUKAJ NA GOOGLE
4.EKSPERYMENTUJ
5.GOTO 1

poza tym, wydaje mi się, że interfejsy to nie Twój poziom.

Ale Ty oczywiście sądzisz że my tutaj będziemy uczyć. Nie. My tutaj rozwiązujemy problemy, od nauki masz artykuły i google generalnie.

A skoro nie podajesz żadnych kodów błędów dawanych przez kompilator znaczy że nawet nie eksperymentowałeś.

Nie żebym się na siłę czepiał, ale według mnie po prostu traktujesz nas jakbyśmy nie mieli własnego czasu, albo żadnych problemów własnych, albo jakbyś nam płacił za pomoc. Tak nie jest. Więc poświęć własny czas aby rozwiązać problemy zanim poprosisz nas o pomoc.


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
edytowany 1x, ostatnio: payl, 2011-08-25 18:38
nie masz ochoty, nie pomagaj. Skoro Twoja kolejność czynności tak uroczo się zapętla to najwyraźniej w ogóle nie obejmuje szukania pomocy na forum. Forum traktuje jako ostateczność po godzinach spędzonych na eksperymentach i przeszukiwaniu artykułów i for (i tu paradoks, gdyby każdy tak podchodził do sprawy jak Ty to na żadnym forum nic bym nie znalazł). I jeszcze jedno: skoro pytasz mnie o kody błędów to znaczy, że w ogóle nie czytałeś mojego posta tylko od razu przeszedłeś do ofensywy. - JacekKw 2011-08-25 18:39
Nie Od razu do ofensywy, ale przeczytałem Twój post. Forum nie jest po aby pytać o podstawy. I nie jest po to aby zasypywać pytaniami. To że przesadzam, świadczy raczej o tym, że jestem lekko zirytowany Tobą. "Skoro Twoja kolejność [...] nie obejmuje szukania pomocy na forum." - oczywiście! Szkoda że nawet mi zdarzało się tutaj zapytać (chociaż nigdy tutaj nie znalazłem pomocy). "Forum traktuje jako ostateczność [...]" - To bardzo dobrze, tylko tego nie widać! Poświęć więcej czasu na dokładny opis problemu, to może nie stwierdze że nie szukałeś/eksperymentowałeś! - payl 2011-08-25 18:59
Nadrabiam zaległości z miesięcy w kilka dni. Siedzę od 10 do 24 z przerwami na 2 posiłki i potrzeby fizjologiczne. Z większością rzeczy radzę sobie sam. Gdybyś przyjrzał się moim tematom to dostrzegłbyś, że w końcu sam dochodzę do rozwiązania w toku dyskusji. I rozwiązania te raportuje na forum bo być może ktoś z tego w przyszłości skorzysta. Chciałbym dysponować Twoją wiedzą, z pewnością wtedy nie byłoby tej dyskusji. - JacekKw 2011-08-25 19:06
O właśnie, i tutaj leży mój tok myślenia, najpierw pytasz potem myślisz. Tak, ja też zawsze gdy znajde rozwiązanie to je opisuje... "Chciałbym dysponować Twoją wiedzą, z pewnością wtedy nie byłoby tej dyskusji." - To przychodzi z czasem, spokojna Twoja głowa <sup>.</sup> . Dobra, mniejsza z tym wszystkim. - payl 2011-08-25 19:43
Czas mnie goni i przy większych przeszkodach pisze posta równo z rozkminianiem na własną rękę. Zwykle staram się upraszczać problem do minimum (tutaj chyba mi się nie udało O_o ) - JacekKw 2011-08-25 19:58

Pozostało 580 znaków

2011-08-25 18:44
0

I teraz wracając do tematu bo o ile opanowałem podstawy interfejsów i klas w javie to w delphi przychodzi mi to z trudem. Podejrzewam że kod zamieszczony wyżej to kompletna sieczka.

Próbowałem podążać za kodem zaprezentowanym w tym artykule: http://www.prestwood.com/ASPS[...]/Document_View.asp?QID=101439 ale wyrzuca mi 'unsatisfied forward or external declaration' na deklaracjach funkcji w części public klasy implementującej interfejs. Nawiasem to ten artykuł, mam wrażenie, nieco inaczej przedstawia tworzenie interfejsów niż rodzimy Interfejsy

W javie interface jest w osobnym pliku, a tutaj mam w jednym unicie interfejs i klase. No i jedna funkcje deklaruje sie najpierw w interfejsie, potem w klasie a na koniec implementuje w tymże samym unicie? O_o

Pozostało 580 znaków

2011-08-25 19:45
0

W javie interface jest w osobnym pliku, a tutaj mam w jednym unicie interfejs i klase. No i jedna funkcje deklaruje sie najpierw w interfejsie, potem w klasie a na koniec implementuje w tymże samym unicie? O_o

Że co?
Podstawowe pytanie: Po co Ci interfejsy?


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.

Pozostało 580 znaków

2011-08-25 19:56
0

Ktoś wymaga bym umiał je stosować i próbuje je zastosować na siłę. Chodzi mi o zbiór funkcji których będzie mogła używać dowolna klasa. Sądziłem, że do tego służą interfejsy

edytowany 1x, ostatnio: JacekKw, 2011-08-25 19:57
A kto Ci zabroni używać jednej klasy z drugiej? Interfejsy stosowałem jeden raz: Gdy klasa podrzędna (w innym unicie) musiała mieć dostęp do części funkcji w klasie nadrzędnej. Ale musze stwierdzić że dzisiaj bym chyba zastosował klasę bazową bo intefejsy są nieźle zrąbane <sup>.</sup> - payl 2011-08-25 20:01
Odpuszcze je sobie jednak - JacekKw 2011-08-25 20:06
Hm, może troche odbiegnę od tematu ale: Rozumiem, że żeby jedna klasa dziedziczyła po drugiej, najlepiej żeby obie były w tym samym unicie? (ma problem z zastosowaniem dziedziczenia, krzyczy mi o brak deklaracji w uses, potem znowu krzyczy że stosuje uses obustronnie) - JacekKw 2011-08-25 20:10

Pozostało 580 znaków

2011-08-25 20:21
1

Hm, może troche odbiegnę od tematu ale: Rozumiem, że żeby jedna klasa dziedziczyła po drugiej, najlepiej żeby obie były w tym samym unicie? (ma problem z zastosowaniem dziedziczenia, krzyczy mi o brak deklaracji w uses, potem znowu krzyczy że stosuje uses obustronnie)

Nie muszą być, właściwie to kompilatorowi to lotto:

unit A;
[...]
type
  Tklasabazowa=class();
 
unit B;
uses A;
[...]
type
 Tpochodna=class(Tklasabazowa);

Ale nie można

unit A;
uses B;
 
unit B;
uses A;

Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
o, dzieki. To sporo wyjasnia - JacekKw 2011-08-25 20:48

Pozostało 580 znaków

2011-08-25 20:55
0

A może jeszcze jedno. Jeśli zadeklaruje w uses użycie danego unitu to automatycznie dostaje dostęp do wszystkich zawartych w nim metod. Jaki jest zatem wtedy praktyczny sens dziedziczenia? (tak, wiem że prawdopodobnie popełniłem gafę :P )

edytowany 1x, ostatnio: JacekKw, 2011-08-25 21:06

Pozostało 580 znaków

2011-08-25 21:32

Jeśli zadeklaruje w uses użycie danego unitu to automatycznie dostaje dostęp do wszystkich zawartych w nim metod.

  1. W module nie ma metod tylko są procedury i funkcje.
  2. Nie do wszystkich, tylko tych wspomnianych w sekcji interface.

A moduły nie dziedziczą...

Jak masz więcej yhm, oczywistych pytań, to pytaj albo w newbie albo na IRC (którego nie ma niestety).


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
Co do 2 to nie mogę się zgodzić :P Mam dostęp do funkcji z sekcji implementation - JacekKw 2011-08-25 21:43
W tym samym module - masz. Ale w innym nie masz, o ile nie jest ta procedura wspomniana w interface. No, chyba że Delphi jest takie porąbane (w co aż ciężko mi uwierzyć). - payl 2011-08-25 22:02
Trudno będzie mi Cie przekonać ale widocznie jest tak porąbane : ) - JacekKw 2011-08-25 23:44
Bzdura, takie coś nie działa http://pastebin.com/ZCDaZJTd (Delphi7). Jeśli w UNIT2.pas dodamy w interface function jacekkw:string; to będzie działać. Wynik - tylko z interfejsu widać. - payl 2011-08-25 23:54
hehe faktycznie. Ze szkoły wyniosłem nawyk deklarowania funkcji w sekcji interface i stąd takie wrażenie - JacekKw 2011-08-26 00:22
payl pomimo szczerych niechęci na początku sporo mnie dziś nauczyłeś :P - JacekKw 2011-08-26 00:23

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0