11. Klasy specjalne Włodzimierz Kasprzak
JiMP3
11. Klasy specjalne
1
Układ
11.1 Klasa abstrakcyjna
11.2 Interfejs
JiMP3
11. Klasy specjalne
2
11.1 Klasa abstrakcyjna
Pewne klasy pełnią jedynie rolę klas bazowych:
Nie ma potrzeby tworzenia obiektów takich klas
Są to klasy abstrakcyjne
N
Niie
e m
m a
a o
o b
biie
e k
k ttó
ó w
w
M
M u
u z
z y
y k
k S
S ttrru
u n
n o
o w
w y
y
k
klla
a s
s a
a b
b s
s ttrra
a k
k c
c y
yjjn
n y
y c
c h
h
{{ k
klla
a s
s a
a a
a b
b s
s ttrra
a k
k c
c y
yjjn
n a
a }}
M
M o
o ż
ż n
n a
a ttw
w o
o rrz
z y
y ć
ć o
o b
biie
e k
k tty
y
k
klla
a s
s k
k o
o n
n k
k rre
e ttn
n y
y c
c h
h
G
Giitta
a rrz
z y
y s
s tta
a
S
S k
k rrz
z y
y p
p e
e k
k
«
« k
k o
o n
n k
k rre
e ttn
n a
a »
»
«
« k
k o
o n
n k
k rre
e ttn
n a
a »
»
JiMP3
11. Klasy specjalne
3
Deklaracja klasy abstrakcyjnej
Do deklaracji klasy abstrakcyjnej służy słowo kluczowe abstract.
a
a b
b s
s t
t r
r a
a c
c t
t
c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n
{
{
.
. .
. .
.
}
}
T
T o
o k
k e
e n
n
c
c l
l a
a s
s s
s
T
T e
e s
s t
t
{ abstrakcyjna }
{
{
{ abstrakcyjna
s
s t
t a
a t
t i
i c
c
v
v o
o i
i d
d
M
M a
a i
i n
n (
(
)
)
{
{
B
Błłłą
ą d
d –
– n
niiie
e m
m o
o ż
ż n
n a
a ttw
w o
o rrz
z y
y ć
ć o
o b
biiie
e k
k ttó
ó w
w
n
n e
e w
w
T
T o
o k
k e
e n
n (
(
)
) ;
;
k
kllla
a s
s y
y a
a b
b s
s ttrra
a k
k c
c y
yjjjn
n e
ejjj
}
}
}
}
JiMP3
11. Klasy specjalne
4
Deklaracja metody abstrakcyjnej
Deklaracja metody ze słowem kluczowym abstract : a
a b
b s
s t
t r
r a
a c
c t
t
c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n
{
{
p
p u
u b
b l
l i
i c
c
v
v i
i r
r t
t u
u a
a l
l
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
)
{
{
.
. .
. .
.
}
}
p
p u
u b
b l
l i
i c
c
a
a b
b s
s t
t r
r a
a c
c t
t
i
i n
n t
t
L
L e
e n
n g
g t
t h
h (
(
)
) ;
;
}
}
c
c l
l a
a s
s s
s
C
C o
o m
m m
m e
e n
n t
t T
T o
o k
k e
e n
n :
:
T
T o
o k
k e
e n
n
{
{
p
p u
u b
b l
l i
i c
c
o
o v
v e
e r
r r
r i
i d
d e
e
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
)
{
{
.
. .
. .
.
}
}
p
p u
u b
b l
l i
i c
c
o
o v
v e
e r
r r
r i
i d
d e
e
i
i n
n t
t
L
L e
e n
n g
g t
t h
h (
(
)
)
{
{
.
. .
. .
.
}
}
}
}
Metody abstrakcyjne mogą być deklarowane jedynie w klasach abstrakcyjnych.
Metody abstrakcyjne nie mogą być definiowane.
JiMP3
11. Klasy specjalne
5
Charakterystyka metod abstrakcyjnych
Metody abstrakcyjne są wirtualne.
Można
nadpisywać
metody abstrakcyjne
metodami
definiowanymi w klasach pochodnych.
Metody abstrakcyjne mogą nadpisywać metody wirtualne, zadeklarowane w klasie bazowej.
Metody abstrakcyjne mogą nadpisywać metody nadpisujące metody wirtualne.
JiMP3
11. Klasy specjalne
6
11.2 Interfejsy
Interfejsy zawierają jedynie deklaracje operacji bez ich definicji.
Interfejsy mogą zawierać deklaracje własności i definicje stałych.
M
M u
u z
z y
y k
k
Z
Z a
a w
wiie
e rra
a d
d e
e k
klla
a rra
a c
cjje
e o
o p
p e
e rra
a c
cjjii..
«
« iin
n tte
e rrffe
ejjs
s »
»
N
Niie
e m
m o
o ż
ż n
n a
a ttw
w o
o rrz
z y
y ć
ć o
o b
biie
e k
k ttó
ó w
w iin
n tte
e rrffe
ejjs
s u
u ..
M
M o
o ż
ż e
e z
z a
a w
wiie
e rra
a c
c p
p e
e w
w n
n e
e d
d e
e ffiin
niic
cjje
e m
m e
e tto
o d
d ..
M
M u
u z
z y
y k
k S
S ttrru
u n
n o
o w
w y
y
N
Niie
e m
m o
o ż
ż n
n a
a ttw
w o
o rrz
z y
y ć
ć o
o b
biie
e k
k ttó
ó w
w
{{ a
a b
b s
s ttrra
a k
k c
c y
yjjn
n a
a }}
k
klla
a s
s y
y a
a b
b s
s ttrra
a k
k c
c y
yjjn
n e
ejj..
M
M u
u s
sii z
z a
a w
wiie
e rra
a ć
ć d
d e
e ffiin
niic
cjje
e w
w s
s z
z y
y s
s ttk
kiic
c h
h
S
S k
k rrz
z y
y p
p e
e k
k
d
d z
ziie
e d
d z
ziic
c z
z o
o n
n y
y c
c h
h o
o p
p e
e rra
a c
cjjii..
«
« k
k o
o n
n k
k rre
e ttn
n a
a »
»
M
M o
o ż
ż n
n a
a ttw
w o
o rrz
z y
y ć
ć o
o b
biie
e k
k tty
y k
klla
a s
s y
y k
k o
o n
n k
k rre
e ttn
n e
ejj..
JiMP3
11. Klasy specjalne
7
Deklaracja interfejsu
Do deklaracji służy słowo kluczowe interface
Wszystkie składowe mają niejawnie dostęp publiczny N
N a
a z
z w
w ę
ę iiin
n tte
e rrffe
ejjjs
s u
u z
z a
a c
c z
z y
y n
n a
a m
m y
y
o
o d
d d
d u
u ż
ż e
ejjj llliiitte
e rry
y “
“ II”
” ((k
k o
o n
n w
w e
e n
n c
cjjja
a ))
i
i n
n t
t e
e r
r f
f a
a c
c e
e
I
I T
T o
o k
k e
e n
n
IToken
{
{
« interfejs »
i
i n
n t
t
L
L i
i n
n e
e N
N u
u m
m b
b e
e r
r (
(
)
) ;
;
LineNumber( )
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
) ;
;
LineNumber(
Name( )
}
}
B
B rra
a k
k s
s p
p e
e c
c y
y ffiiik
k a
a c
cjjjiii
B
B rra
a k
k ttrre
e ś
ś c
ciii
t
t rry
y b
b u
u d
d o
o s
s ttę
ę p
p u
u
d
d e
e ffiiin
niiic
cjjjiii m
m e
e tto
o d
d
JiMP3
11. Klasy specjalne
8
Implementowanie wielu interfejsów
Klasa może implementować zero lub więcej interfejsów i
i n
n t
t e
e r
r f
f a
a c
c e
e
I
I T
T o
o k
k e
e n
n
{
{
IToken
IVisitable
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
) ;
;
« interfejs »
« interfejs »
}
}
i
i n
n t
t e
e r
r f
f a
a c
c e
e
I
I V
V i
i s
s i
i t
t a
a b
b l
l e
e
{
{
v
v o
o i
i d
d
A
A c
c c
c e
e p
p t
t (
( I
I V
V i
i s
s i
i t
t o
o r
r
v
v )
) ;
;
}
}
c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n :
:
I
I T
T o
o k
k e
e n
n ,
,
I
I V
V i
i s
s i
i t
t a
a b
b l
l e
e
Token
{
{
.
. .
. .
.
« konkretna »
}
}
Interfejs może dziedziczyć po innych interfejsach, w tym po wielu naraz.
Klasa może mieć szerszy dostęp niż jej bazowe interfejsy.
Interfejs nie może być szerzej dostępny niż jego bazowe interfejsy.
JiMP3
11. Klasy specjalne
9
Implementowanie metod interfejsu
Klasa musi implementować wszystkie metody interfejsu bazowego.
Implementująca metoda w klasie konkretnej musi mieć identyczną deklarację co implementowana metoda interfejsu.
Implementująca metoda może być wirtualna lub nie.
c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n :
:
I
I T
T o
o k
k e
e n
n ,
,
I
I V
V i
i s
s i
i t
t a
a b
b l
l e
e
{
{
p
p u
u b
b l
l i
i c
c
v
v i
i r
r t
t u
u a
a l
l
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
)
Ten sam typ wyniku
{
{
.
. .
. .
.
Ta sama nazwa
}
}
Te same parametry
p
p u
u b
b l
l i
i c
c
v
v o
o i
i d
d
A
A c
c c
c e
e p
p t
t (
( I
I V
V i
i s
s i
i t
t o
o r
r
v
v )
)
Te same parametr
{
{
.
. .
. .
.
}
}
}
}
JiMP3
11. Klasy specjalne
10
Implementacja jawna metody interfejsu
Korzystamy z nazwy kwalifikowanej dla metody interfejsu: c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n :
:
I
I T
T o
o k
k e
e n
n ,
,
I
I V
V i
i s
s i
i t
t a
a b
b l
l e
e
{
{
s
s t
t r
r i
i n
n g
g
I
I T
T o
o k
k e
e n
n .
. N
N a
a m
m e
e (
(
)
)
{
{
.
. .
. .
.
}
}
v
v o
o i
i d
d
I
I V
V i
i s
s i
i t
t a
a b
b l
l e
e .
. A
A c
c c
c e
e p
p t
t (
( I
I V
V i
i s
s i
i t
t o
o r
r
v
v )
)
{
{
.
. .
. .
.
}
}
}
}
Ograniczenia dla jawnej implementacji metod interfejsu:
Dostęp do metod możliwy jest jedynie poprzez interfejs
Te metody nie mogą być deklarowane jako wirtualne
Nie można podać kwalifikatora dostępu.
JiMP3
11. Klasy specjalne
11
Test: wykryj błędy!
i
i n
n t
t e
e r
r f
f a
a c
c e
e
I
I T
T o
o k
k e
e n
n
{
{
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
) ;
;
i
i n
n t
t
L
L i
i n
n e
e N
N u
u m
m b
b e
e r
r (
(
)
) {
{ r
r e
e t
t u
u r
r n
n
4
4 2
2 ;
; }
}// Błąd – definicja metody
s
s t
t r
r i
i n
n g
g
n
n a
a m
m e
e ;
;
// Błąd – pole nie może tu wystąpić
}
}
c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n
: IToken // Błąd – brak implementacji interfejsu
{
{
// Błąd – brak implementacji LineNumber() s
s t
t r
r i
i n
n g
g
I
I T
T o
o k
k e
e n
n .
. N
N a
a m
m e
e (
(
)
)
{
{ .
. .
. .
. }
}
s
s t
t a
a t
t i
i c
c
v
v o
o i
i d
d
M
M a
a i
i n
n (
(
)
)
{
{
I
I T
T o
o k
k e
e n
n
t
t
=
=
n
n e
e w
w
I
I T
T o
o k
k e
e n
n (
(
)
) ;
;
}
}
// Błąd – nie ma obiektu interfejsu
}
}
JiMP3
11. Klasy specjalne
12
Rola klasy abstrakcyjnej i interfejsu w hierarchii klas
Przykład 1
i
i n
n t
t e
e r
r f
f a
a c
c e
e
I
I T
T o
o k
k e
e n
n
I
I T
T o
o k
k e
e n
n
{
{
« interfejs »
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
) ;
;
« interfejs
}
}
a
a b
b s
s t
t r
r a
a c
c t
t
c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n :
:
I
I T
T o
o k
k e
e n
n
{
{
T
T o
o k
k e
e n
n
s
s t
t r
r i
i n
n g
g
I
I T
T o
o k
k e
e n
n .
. N
N a
a m
m e
e (
(
)
)
{
{
.
. .
. .
.
{ abstrakcyjna }
}
}
.
. .
. .
.
}
}
c
c l
l a
a s
s s
s
C
C o
o m
m m
m e
e n
n t
t T
T o
o k
k e
e n
n :
:
T
T o
o k
k e
e n
n
Comment
Keyword
{
{
.
. .
. .
.
Token
Token
}
}
« konkretna »
« konkretna »
c
c l
l a
a s
s s
s
K
K e
e y
y w
w o
o r
r d
d T
T o
o k
k e
e n
n :
:
T
T o
o k
k e
e n
n
{
{
.
. .
. .
.
}
}
JiMP3
11. Klasy specjalne
13
Rola klas abstrakcyjnych (2)
Przykład 2
i
i n
n t
t e
e r
r f
f a
a c
c e
e
I
I T
T o
o k
k e
e n
n
I
I T
T o
o k
k e
e n
n
{
{
« interfejs »
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
) ;
;
}
}
a
a b
b s
s t
t r
r a
a c
c t
t
c
c l
l a
a s
s s
s
T
T o
o k
k e
e n
n
{
{
T
T o
o k
k e
e n
n
p
p u
u b
b l
l i
i c
c
v
v i
i r
r t
t u
u a
a l
l
s
s t
t r
r i
i n
n g
g
N
N a
a m
m e
e (
(
)
)
{ abstrakcyjna }
{
{
.
. .
. .
.
{ abstrakcyjna
}
}
.
. .
. .
.
}
}
Comment
Keyword
c
c l
l a
a s
s s
s
C
C o
o m
m m
m e
e n
n t
t T
T o
o k
k e
e n
n :
:
T
T o
o k
k e
e n
n ,
,
I
I T
T o
o k
k e
e n
n
Comment
Keywor
{
{
.
. .
. .
.
Token
Token
}
}
« konkretna »
« konkretna »
c
c l
l a
a s
s s
s
K
K e
e y
y w
w o
o r
r d
d T
T o
o k
k e
e n
n :
:
T
T o
o k
k e
e n
n ,
,
I
I T
T o
o k
k e
e n
n
{
{
.
. .
. .
.
}
}
JiMP3
11. Klasy specjalne
14
Porównanie: klasy abstrakcyjne a interfejsy
Podobieństwa
Nie mogą być tworzone obiekty tych klas
Nie mogą być „plombowane”
Różnice
Interfejs nie może zawierać żadnej definicji metody
Interfejs nie może zawierać deklaracji nie-publicznych składowych
Interfejs
nie może dziedziczyć klas, poza innymi interfejsami.
JiMP3
11. Klasy specjalne
15
Test: wykryj błędy!
c
c l
l a
a s
s s
s
F
F i
i r
r s
s t
t
// Metoda abstrakcyjna tylko w klasie abstrakcyjnej
{
{
1
ł
p
p u
u b
b l
l i
i c
c
a
a b
b s
s t
t r
r a
a c
c t
t
v
v o
o i
i d
d
M
M e
e t
t o
o d
d a
a (
(
)
) ;
;
B ąd
}
}
a
a b
b s
s t
t r
r a
a c
c t
t
c
c l
l a
a s
s s
s
S
S e
e c
c o
o n
n d
d
{
{
Błąd
p
p u
u b
b l
l i
i c
c
a
a b
b s
s t
t r
r a
a c
c t
t
v
v o
o i
i d
d
M
M e
e t
t o
o d
d a
a (
(
)
)
{
{
}
}
2
}
}
// Metoda abstrakcyjna nie może być definiowana i
i n
n t
t e
e r
r f
f a
a c
c e
e
I
I T
T h
h i
i r
r d
d
{
{
v
v o
o i
i d
d
M
M e
e t
t o
o d
d a
a (
(
)
) ;
;
Błąd
}
}
3
ą
a
a b
b s
s t
t r
r a
a c
c t
t
c
c l
l a
a s
s s
s
T
T h
h i
i r
r d
d :
:
I
I T
T h
h i
i r
r d
d
{
{
// Brak implementacji Metoda() lub jej deklaracji jako abstrakcyjnej
}
}
JiMP3
11. Klasy specjalne
16