🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310309

Re: Sztuka Kodowania w C++ - Nowa Wersja!

#310309
From: Jacek Jaworski
Date: Wed, 09 Dec 2020 15:35
25 lines
3979 bytes
> Swego czasu szukałem historycznego uzasadnienia dla wielodziedziczenia, i jedyne, co znalazłem, to przykład z książki Coxa i Novobilskiego "Object Oriented Programming: An Evolutionary Approach", gdzie dla uzasadnienia wielodziedziczenia posługują się przykładem "zabawkowego samochodu" ("czy jest to rodzaj zabawki, czy rodzaj samochodu?", pytają, odpowiadając sobie, że dzięki wielodziedziczeniu może być "i jednym, i drugim") 

Takie "uzasadnienie" jest dla dzieci. Bo w praktyce zaczynamy od pojęcia zabawki. Wynika to z przypadku użycia w którym głównym aktorem jest dziecko. Kolejne zabawki dziedziczymy z tej klasy. Nie dziedziczymy po klasie samochód, bo żaden prawdziwy samochód nie jest zabawką dla dziecka. Zabawki nie są rodzajem samochodu. Samochodziki są rodzajem zabawki. Tak samo jak dziecko nie jest typem pochodnym od Lalka (dziecko bawi się laką ale nie innym dzieckiem).
Hierarchia klas w tym przypadku jest: class Zabawka {...}; class Samochodzik : public Zabawka {...}; I dalej: class Lalka : public Zabawka {...};
To tyle o tym bez sensownym przykładzie.

Podam za to prawdziwy przykład z mojego projektu. Ten problem jaki rozwiązuje wielodziedziczenie jest fundamentalny i (pomijając chamskie kopiowanie kodu w każdej klasie) jest nierozwiązywalny w inny sposób (nawet przez kompozycję).

Problem:
Dostajemy bibliotekę Qt. Chcemy z niej korzystać w projekcie. Nie chcemy jej zmieniać, w myśl inżynierskiej zasady: "Zamknięte na modyfikacje: otwarte na rozszerzanie." Zakładamy (fałszywie), że Qt spełnia w pełni tą zasadę.
Mamy klasę QWidget która jest przodkiem okien i kontrolek Qt.
I teraz: chcemy kontrolki Qt sobie dostosować. Zauważamy przy tym, że część funkcjonalności jest wspólna i powinna być w klasie QWidget. Ale tej klasy nie możemy ruszyć (powyższa zasada inżynierii oprogramowania).

Rozwiązanie:
By nie kopiować kodu w każdej naszej klasie kontrolki musimy zrobić klasę po której dziedziczą wszystkie kontrolki używane przez nas w projekcie.

Czyli mamy klasy:
class MojaKontrolka {...};
class Etykieta : public QLabel, public MojaKontrolka {...};
class EdycjaWLini : public QLineEdit, public MojaKontrolka {...};
class Edycja : public QTextEdit, public MojaKontrolka {...};
class ListaRozwijana : public QComboBox, public MojaKontrolka {...};
I tak dalej...

Ten problem dotyczy każdej większej biblioteki jaką chcemy używać w nietrywialny sposób.
Technical Details
Message-ID: <8d469f13-e697-4488-8adf-29117a3eeb8cn@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!feeder.erje.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
References: <478ab743-cd00-4961-88e1-983025db304bn@googlegroups.com> <d9830106-c21a-4564-b45f-0766ef86181fn@googlegroups.com> <cdd14123-89b7-4f80-9f2b-865f1038810an@googlegroups.com> <e38a42c4-36d3-49b6-8644-468f65828f4cn@googlegroups.com> <edd1ce6a-46e1-4883-8943-db4a0da8da33n@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:620a:10b5:: with SMTP id h21mr2238605qkk.39.1607528147788;        Wed, 09 Dec 2020 07:35:47 -0800 (PST)
X-Received: by 2002:ae9:c114:: with SMTP id z20mr3832005qki.116.1607528147595; Wed, 09 Dec 2020 07:35:47 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!feeder.erje.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Wed, 9 Dec 2020 07:35:47 -0800 (PST)
In-Reply-To: <edd1ce6a-46e1-4883-8943-db4a0da8da33n@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: google-groups.googlegroups.com; posting-host=156.67.104.28; posting-account=uFgJ3goAAAAHaGlwfVGxxrSUMlvEACGk
NNTP-Posting-Host: 156.67.104.28
References: <478ab743-cd00-4961-88e1-983025db304bn@googlegroups.com> <d9830106-c21a-4564-b45f-0766ef86181fn@googlegroups.com> <cdd14123-89b7-4f80-9f2b-865f1038810an@googlegroups.com> <e38a42c4-36d3-49b6-8644-468f65828f4cn@googlegroups.com> <edd1ce6a-46e1-4883-8943-db4a0da8da33n@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <8d469f13-e697-4488-8adf-29117a3eeb8cn@googlegroups.com>
Subject: Re: Sztuka Kodowania w C++ - Nowa Wersja!
From: Jacek Jaworski <jaworski1978@adres.pl>
Injection-Date: Wed, 09 Dec 2020 15:35:47 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit