🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #153626

Re: Zmienna z klasy potomnej w klasie bazowej

#153626
From: Arivald
Date: Sun, 28 Oct 2012 07:59
83 lines
3295 bytes
W dniu 2012-10-28 08:48, Arivald pisze:
> W dniu 2012-10-27 18:41, Smok pisze:
>> Cześć.
>> Czy w abstrakcyjnej klasie bazowej można użyć metody która
>> wykorzystuje zmienną z klasy potomnej? Jak to zrobić?
>> Mam klasę "Działanie" w której chcę napisać metodę która wyrzuci na
>> standardowe wyjście wartość zmiennej char ustawionej już klasie
>> pochodnej (np dodawanie wyrzuci znak + a mnożenie wyrzuci znak *).
>> Dzięki
>> Smok.
>>
>
> Dziwne pytanie. Skoro wiesz co to "klasa abstrakcyjna", to wydawało by
> się że wiesz jak działają funkcje wirtualne.
>
>
> Co do pytania, w klasie bazowej deklarujesz tą metodę z modyfikatorem
> "virtual", opcjonalnie "abstract" jeśli nie chcesz dostarczać ciała
> metody w klasie bazowej.
>
> type Dzialanie= class
> public
>    procedure PrintOperator(); virtual; abstract;
>
> W klasie potomnej redeklarujesz metodę z modyfikatorem "override".
>
> type Mnozenie = class(Dzialanie)
> public
>    procedure PrintOperator(); override;
>
>
> procedure Mnozenie.PrintOperator();
> begin
>    Print('*');
> end;
>
> i teraz dla kodu:
>
>    var zmienna: Dzialanie.
>
>    zmienna = Mnozenie.Create();
>
> Przy wywołaniu
>    zmienna.PrintOperator();
>
> Zostanie wykonana wersja metody z Mnozenie. A skoro tak, to może ona
> używać wszystkich zmiennych z Mnozenie.
>
>
> BTW do tak prostego zadanie nie musisz nawet mieć zmiennej. Operator
> może być hardkodowany w implementacji funkcji. To dość typowe
> zastosowanie funkcji wirtualnych.
>
>

Sorki, języki mi się pomieszały, ta grupa jest do Javy... Chociaż zasada 
działania ta sama. Dodatkowo w Javie wszystkie funkcje są wirtualne, 
więc nie trzeba tego jawnie deklarować, poza "abstract".

kod:

class Dzialanie {
   public abstract void printOperator();
}

class Mnozenie extends Dzialanie {
   @Override
   public void printOperator() {
     System.out.print('*');
   }
}

i użycie:

   Dzialanie zmienna = new Mnozenie();

   zmienna.printOperator();

Adnotacja "@Override" jest opcjonalna, ale zwiększa czytelnoć kodu i 
bardzo pomaga przy refaktoringu, więc lepiej zawsze ją pisać.

-- 
Arivald
Technical Details
Message-ID: <k6iok8$idu$1@news.dialog.net.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.task.gda.pl!news.dialog.net.pl!not-for-mail
References: <76d5aa43-7b1d-4f05-85d7-35c20ccb23e2@googlegroups.com> <k6io11$i4g$1@news.dialog.net.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.task.gda.pl!news.dialog.net.pl!not-for-mail
From: Arivald <NOSPAMarivald@interia.pl>
Newsgroups: pl.comp.lang.java
Subject: Re: Zmienna z klasy potomnej w klasie bazowej
Date: Sun, 28 Oct 2012 08:59:07 +0100
Organization: Dialog Net
Lines: 84
Message-ID: <k6iok8$idu$1@news.dialog.net.pl>
References: <76d5aa43-7b1d-4f05-85d7-35c20ccb23e2@googlegroups.com> <k6io11$i4g$1@news.dialog.net.pl>
NNTP-Posting-Host: dynamic-78-8-143-68.ssp.dialog.net.pl
Mime-Version: 1.0
X-Trace: news.dialog.net.pl 1351411144 18878 78.8.143.68 (28 Oct 2012 07:59:04 GMT)
X-Complaints-To: abuse@dialog.net.pl
NNTP-Posting-Date: Sun, 28 Oct 2012 07:59:04 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/17.0 Thunderbird/17.0
In-Reply-To: <k6io11$i4g$1@news.dialog.net.pl>
X-Antivirus: avast! (VPS 121027-1, 2012-10-27), Outbound message
X-Antivirus-Status: Clean
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit