Je - Is-a
Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto otázkách na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
v reprezentace znalostí, objektově orientované programování a design (vidět objektově orientovaný programová architektura ), je (je nebo je) je subsumpce[1] vztah mezi abstrakce (např. typy, třídy ), kde jeden třída A je podtřída jiné třídy B (a tak B je nadtřída z AJinými slovy, typ A je podtypem typu B, když je A Specifikace implikuje specifikaci B. To znamená, že jakýkoli objekt (nebo třída), který splňuje specifikaci A, také vyhovuje specifikaci B, protože specifikace B je slabší.[2]
The je vztah je třeba porovnat s má (má nebo má) vztah mezi typy (třídami); matoucí vztahy má a je je běžná chyba při navrhování modelu (např počítačový program ) vztahu reálného světa mezi objektem a jeho podřízeným. The je vztah může být také v kontrastu s instance-of vztah mezi objekty (instance) a typy (třídy): viz "rozlišení typu tokenu " a "vztahy typu token."[3]
Abychom shrnuli vztahy, existují:
- hyperonymum –hyponymum (supertyp – podtyp) vztahy mezi typy (třídami) definující taxonomickou hierarchii, kde
- pro subsumpce relace: hyponymum (podtyp, podtřída) má a Typ (je) vztah s jeho hyperonymem (supertyp, nadtřída);
- holonym –meronymum (celek / entita / kontejner-část / složka / člen) vztahy mezi typy (třídami) definující posesivní hierarchii, kde
- relace koncept-objekt (typ-token) mezi typy (třídy) a objekty (instance), kde
- token (objekt) má instance-of vztah s jeho typem (třídou).
Příklady podtypu
Podtypování umožňuje nahrazení daného typu jiným typem nebo abstrakcí. Subtypizace prý zakládá je vztah mezi podtypem a nějakou existující abstrakcí, ať už implicitně nebo explicitně, v závislosti na jazykové podpoře. Vztah lze vyjádřit explicitně prostřednictvím dědičnosti v jazycích, které podporují dědičnost jako mechanismus podtypů.
C ++
Následující kód C ++ zavádí explicitní vztah dědičnosti mezi třídami B a A, kde B je podtřídou i podtypem Aa lze jej použít jako A kdekoli a B je zadáno (prostřednictvím odkazu, ukazatele nebo samotného objektu).
třída A{ veřejnost: prázdnota DoSomethingALike() konst {}};třída B : veřejnost A{ veřejnost: prázdnota DoSomethingBLike() konst {}};prázdnota UseAnA(A konst& some_A){ some_A.DoSomethingALike();}prázdnota SomeFunc(){ B b; UseAnA(b); // b lze nahradit A.}
Krajta
Následující kód pythonu vytváří explicitní vztah dědičnosti mezi třídami B a A, kde B je podtřídou i podtypem Aa lze jej použít jako A kdekoli a B je požadováno.
třída A: def do_something_a_like(já): složittřída B(A): def do_something_b_like(já): složitdef use_an_a(some_a): some_a.do_something_a_like()def some_func(): b = B() use_an_a(b) # b může být nahrazen za A.
Následující příklad, typ (a) je "běžný" typ a typ (typ (a)) je metatyp. Zatímco při distribuci mají všechny typy stejný metatyp (PyType_Type, což je také jeho vlastní metatyp), to není požadavek. Typ klasických tříd, známý jako typy. ClassType, lze také považovat za zřetelný metatyp.[6]
>>> A = 0>>> typ(A)<type 'int'>>>> typ(typ(A))<type 'type'>>>> typ(typ(typ(A)))<type 'type'>>>> typ(typ(typ(typ(A))))<type 'type'>
Jáva
V Javě je vztah mezi parametry typu jedné třídy nebo rozhraní a parametry typu jiné jsou určeny rozsahy a nářadí doložky.
Pomocí tříd Collections ArrayList
rozhraní PayloadList<E, P> rozšiřuje Seznam<E> { prázdnota setPayload(int index, P val); ...}
Následující parametrizace PayloadList jsou podtypy List
PayloadList<Tětiva, Tětiva>PayloadList<Tětiva, Celé číslo>PayloadList<Tětiva, Výjimka>
Princip substituce Liskov
Princip substituce Liskov vysvětluje vlastnost, "Pokud pro každý objekt o1 typu S existuje objekt o2 typu T takový, že pro všechny programy P definované v termínech T se chování P nemění, když je o1 nahrazeno o2, pak S je podtyp T,".[7] Následující příklad ukazuje porušení LSP.
prázdnota DrawShape(konst Tvar& s){ -li (psí typ(s) == psí typ(Náměstí)) DrawSquare(static_cast<Náměstí&>(s)); jiný -li (psí typ(s) == psí typ(Kruh)) DrawCircle(static_cast<Kruh&>(s));}
Je zřejmé, že funkce DrawShape je špatně naformátovaná. Musí to vědět o všech odvozených třídách třídy Shape. Mělo by se také změnit, kdykoli se vytvoří nová podtřída tvaru. v objektově orientovaný design, mnoho[SZO? ] pohlížejte na jeho strukturu jako na anathema.
Zde je jemnější příklad porušení LSP:
třída Obdélník{ veřejnost: prázdnota SetWidth(dvojnásobek w) { jeho šířka = w; } prázdnota Nastavit Výška(dvojnásobek h) { jeho výška = h; } dvojnásobek Získejte výšku() konst { vrátit se jeho výška; } dvojnásobek GetWidth() konst { vrátit se jeho šířka; } soukromé: dvojnásobek jeho šířka; dvojnásobek jeho výška;};
To funguje dobře, ale pokud jde o třídu Square, která zdědí třídu Rectangle, porušuje LSP, i když je vztah existuje mezi obdélníkem a čtvercem. Protože čtverec je obdélníkový. Následující příklad přepíše dvě funkce, Setwidth a SetHeight, aby se problém vyřešil. Oprava kódu však znamená, že design je vadný.
veřejnost třída Náměstí : Obdélník{ veřejnost: virtuální prázdnota SetWidth(dvojnásobek w); virtuální prázdnota Nastavit Výška(dvojnásobek h);};prázdnota Náměstí::SetWidth(dvojnásobek w){ Obdélník::SetWidth(w); Obdélník::Nastavit Výška(w);}prázdnota Náměstí::Nastavit Výška(dvojnásobek h){ Obdélník::Nastavit Výška(h); Obdélník::SetWidth(h);}
Následující příklad, funkce g funguje pouze pro třídu Rectangle, ale ne pro Square, a proto byl porušen princip otevřeno-zavřeno.
prázdnota G(Obdélník& r){ r.SetWidth(5); r.Nastavit Výška(4); tvrdit(r.GetWidth() * r.Získejte výšku()) == 20);}
Viz také
- Dědičnost (objektově orientované programování)
- Princip substituce Liskov (v objektově orientované programování )
- Subsumption
- Je
- Má
Poznámky
- ^ Vidět Princip substituce Liskov.
- ^ „Podtypy a podtřídy“ (PDF). MIT OCW. Citováno 2. října 2012.
- ^ Vztahy typu – token
- ^ Viz také Zadržení (počítačové programování).
- ^ Mitchell, John (2002). "10" koncepty v objektově orientovaných jazycích"". Koncepty v programovacím jazyce. Cambridge, Velká Británie: Cambridge University Press. str. 287. ISBN 0-521-78098-5.
- ^ Guido van Rossum. „Subtyping Built-in Types“. Citováno 2. října 2012.
- ^ Liskov, Barbara (květen 1988). Abstrakce dat a hierarchie (PDF). Oznámení SIGPLAN.
- ^ „Zásada substituce Liskov“ (PDF). Robert C. Martin, 1996. Archivovány od originál (PDF) dne 5. září 2015. Citováno 2. října 2012.
Reference
- Ronald J. Brachman; Co IS-A je a není. Analýza taxonomických vazeb v sémantických sítích. Počítač IEEE, 16 (10); Říjen 1983
- Jean-Luc Hainaut, Jean-Marc Hick, Vincent Englebert, Jean Henrard, Didier Roland: Pochopení implementace vztahů IS-A. ER 1996: 42-57