Наследование (программирование)
- 1 year ago
- 0
- 0
??????????? ????????????
(
????.
diamond inheritance
) — ???????? ?
????????-???????????????
?????? ????????????????
? ??????????
?????????????? ????????????
, ????? ???
??????
B
?
C
?????????
??
A
, ? ?????
D
????????? ?? ????? ???????
B
?
C
. ??? ???? ????? ???????????? ????? ?????????? ???????????????: ????
??????
??????
D
???????? ?????, ???????????? ? ??????
A
(? ???? ????? ?? ???
?????????????
? ??????
D
), ? ??????
B
?
C
??-?????? ?????????????? ???? ?????, ?? ?? ?????? ?????? ??? ???????????:
B
???
C
?
????????, ? ???????
??????????
??????????? ???????????
?????
Button
(«??????») ????? ???????????? ??????????? ?? ??????
Rectangle
(«?????????????», ??? ???????? ????) ? ?? ??????
Clickable
(«???????? ??? ???????? ??????», ??? ?????????? ????????????????/????????? ?????), ?
Rectangle
?
Clickable
????????? ?? ??????
Object
(«??????»). ???? ??????? ?????
equals
(«?????») ??? ???????
Button
, ? ? ??????
Button
?? ???????? ?????? ??????, ?? ? ??????
Object
????? ?????????????? ?????
equals
??-?????? ???????????????? ??? ? ??????
Rectangle
, ??? ? ?
Clickable
, ?? ????? ?? ??????? ?????? ???? ???????
???????? ????? (
????.
diamond problem
) ???????? ???? ???????? ????????? ?????????? ????????? ???????????? ??????? ? ???? ????????. ? ?????? ??????, ?????
A
???????????? ? ???? ???????, ??????
B
?
C
?? ??????????? ??????????? ????, ?
D
??????????? ? ?????? ? ????? ????, ???????
????
.
????????? ????? ???????????????? ?????? ???????? ???????????? ???????????? ?????????? ?????????:
D
????? ?? ????? ???? ????????? ??? ?????? ??????????
A
, ? ??? ????????????? ??????
A
??????????? ??????? ???? ???????????? (
B::A
???
C::A
). ????? ????????????? ??????????? ????????? ????????????, ?????????? ???????????????
???????????
????????????? ??????
A
?? ?????????? ????? ????????????: ???? ??? ???????????? ??
A
?
B
? ??
A
?
C
?????????? ??????????????
virtual
(????????,
class B : virtual public A
), C++ ??????????? ??????? ????????? ?? ????????? ?????? ?????? ??????????
A
, ? ????????????? ??????
A
????? ???????? ?????????. ????
???????????
? ????????????? ???????????? ???????????, ?? ?????????? ???? ??????????? ?????????
A
? ?? ?????? ?????????????? ??????????
A
??? ??????? ???? ?????????????? ???????????? ?
A
. ??? ??????????? ?????? ?????? ???????????? ???????? ?????? ???????????? ??? ?????????? ??????? ?????????????: ?????????? ????????? ??????????? ????? ??????, ??????? ??? ?????????? ?? ?????????? ????? ????????????.
select
?
rename
, ? ?????? ??????, ??????? ???????????? ? ????????, ??????????? ????. ??? ????????? ????????? ???????????? ?????? ????????????? ?????? ? ???????? ??? ????????????? ?? ????????? ????? ????????????? ??????.
B
? ??? ?????? ????? ????????? ????? ???????
C
? ??? ????????, ??? ??? ????? ?
A
????? ??????????? ??
B
; ?????? ?????????? — [
D
,
B
,
A
,
C
]. ??? ???? ? Perl ?????? ????????? ????? ???? ???????? ??? ??????
mro
??? ?????? ??????? ??? ??????????
C3-????????????
(??? ? Python) ??? ?????? ??????????.
object
; ??????? ? ???? ?????? ???? ?????? ????????? ?????? ?????????? ??? ??????
C3-????????????
. ? ?????? ????? ??? ????????
????? ? ???????
, ??????? ????? (
D
,
B
,
A
,
C
,
A
), ? ????? ???????? ?? ?????? ????, ????? ?????????? ????????? ??????? ??????, ??????? ? ?????? ???????????. ?????????????, ???????? ??????? ?????????? ???????? ???: [
D
,
B
,
C
,
A
].
D
,
C
,
A
,
B
,
A
], ? ????? ???????? ?????????? — [
D
,
C
,
B
,
A
].
(individual as Person).printInfo();
.
?????, ??????????? ???? ??????? ???????????? (??? ????????, ??? , Objective-C , PHP , C# , Delphi / Free Pascal ? Java ), ??????????????? ????????????? ???????????? ??????????? (? Objective-C ?????????? ???????????). ?????????? ?? ???? ???????? ???????????? ???????? ????????, ??? ?????? ??????? ????? ??????????, ? ??? ??????????? ????. ????? ???????, ???????? ?? ?????????, ??? ??? ?????? ????? ?????? ???? ?????????? ????????????? ?????? ??? ????????, ?? ???????? ????????????? ????????????????.
???????? ????? ?? ?????????????? ???? ?????????????. ??? ????? ????????? ? ????? ??????, ???
??
?
C++
, ?????
???????????? ?????
A, B, C ? D, ? ????? ?????????
??????????????????? ?????????
, ????????? ?? B ? C, ???????????? (??? ?????? ??????????
#include
) ???? ? ??????? ?? ??????????? ?????, ????????? ??????. ???? ??? ??? ??????????????????? ????????? ????????????, ?????????? ? A ???????????, ? ?????????
?????? ???????????
#ifndef
?????????? ?????????????. ????? ???????? ?????????????? ??? ??????????? ??????
??????????????? ???????????
; ????????, ???? A — ??? ???? ??????, ? B ? C —
, ?? D ????? ????????? ??? B, ??? ? C ??????????? (
COMMIT
) ?????????? ??????????, ??????? ? ??????????? ??????? ????????????? A.