Article View: pl.comp.lang.java
Article #153626Re: Zmienna z klasy potomnej w klasie bazowej
From: Arivald
Date: Sun, 28 Oct 2012 07:59
Date: Sun, 28 Oct 2012 07:59
83 lines
3295 bytes
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-mailReferences:
<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