词条 | Is-a |
释义 |
}} In knowledge representation, object-oriented programming and design (see object-oriented program architecture), is-a (is_a or is a) is a subsumption[1] relationship between abstractions (e.g. types, classes), wherein one class A is a subclass of another class B (and so B is a superclass of A). In other words, type A is a subtype of type B when A’s specification implies B’s specification. That is, any object (or class) that satisfies A’s specification also satisfies B’s specification, because B’s specification is weaker.[2] The is-a relationship is to be contrasted with the has-a (has_a or has a) relationship between types (classes); confusing the relations has-a and is-a is a common error when designing a model (e.g., a computer program) of the real-world relationship between an object and its subordinate. The is-a relationship may also be contrasted with the instance-of relationship between objects (instances) and types (classes): see "type-token distinction" and "type-token relations."[3] To summarize the relations, we have
Examples of subtypingSubtyping enables a given type to be substituted for another type or abstraction. Subtyping is said to establish an is-a relationship between the subtype and some existing abstraction, either implicitly or explicitly, depending on language support. The relationship can be expressed explicitly via inheritance in languages that support inheritance as a subtyping mechanism. C++The following C++ code establishes an explicit inheritance relationship between classes B and A, where B is both a subclass and a subtype of A, and can be used as an A wherever a B is specified (via a reference, a pointer or the object itself). { public:}; class B : public A { public:}; void UseAnA(A const& some_A) {} void SomeFunc() {B b; UseAnA(b); // b can be substituted for an A. } [5]PythonThe following python code establishes an explicit inheritance relationship between classes B and A, where B is both a subclass and a subtype of A, and can be used as an A wherever a B is required. def doSomethingALike(self): pass class B(A): def doSomethingBLike(self): pass def useAnA(some_A): def someFunc(): b = B() useAnA(b) # b can be substituted for an A. The following example, type(a) is a "regular" type, and type(type(a)) is a metatype. While as distributed all types have the same metatype (PyType_Type, which is also its own metatype), this is not a requirement. The type of classic classes, known as types.ClassType, can also be considered a distinct metatype.[6] JavaIn Java, is-a relation between the type parameters of one class or interface and the type parameters of another are determined by the extends and implements clauses. Using the Collections classes, ArrayList The following parameterizations of PayloadList are subtypes of List Liskov substitution principle{{main|Liskov substitution principle}}Liskov substitution principle explains a property, "If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T,".[7] Following example shows a violation of LSP. {if (typeid(s) == typeid(Square)) DrawSquare(static_cast } Obviously, the DrawShape function is badly formatted. It has to know about every derivative classes of Shape class. Also, it should be changed whenever new subclass of Shape are created. In object-oriented design, many{{who|date=April 2017}} view the structure of this as anathema. Here is a more subtle example of violation of LSP: This works well but when it comes to Square class, which inherits Rectangle class, it violates LSP even though the is-a relationship holds between Rectangle and Square. Because square is rectangular. The following example overrides two functions, Setwidth and SetHeight, to fix the problem. But fixing the code implies that the design is faulty. The following example, function g just works for Rectangle class but not for Square, and so the open-closed principle has been violated. [8]See also
Notes1. ^See Liskov substitution principle. 2. ^{{cite web|title=Subtypes and Subclasses|url=http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-170-laboratory-in-software-engineering-fall-2005/lecture-notes/lec14.pdf|publisher=MIT OCW|accessdate=2 October 2012}} 3. ^Type–token relations 4. ^See also Containment (computer programming). 5. ^{{cite book | last=Mitchell | first=John | authorlink=John C. Mitchell | title=Concepts in programming language | year=2002 | publisher=Cambridge University Press | location=Cambridge, UK | isbn=0-521-78098-5 | page=287 | chapter=10 "Concepts in object-oriented languages"}} 6. ^{{cite web|author=Guido van Rossum|title=Subtyping Built-in Types|url=https://www.python.org/dev/peps/pep-0253/|accessdate=2 October 2012}} 7. ^{{cite book|last=Liskov|first=Barbara|title=Data Abstraction and Hierarchy|date=May 1988|publisher=SIGPLAN Notices}} 8. ^{{cite web|title=The Liskov Substitution Principle |url=http://www.objectmentor.com/resources/articles/lsp.pdf |publisher=Robert C. Martin, 1996 |accessdate=2 October 2012 |deadurl=yes |archiveurl=https://web.archive.org/web/20150905081111/http://www.objectmentor.com/resources/articles/lsp.pdf |archivedate= 5 September 2015 |df= }} References
4 : Object-oriented programming|Knowledge representation|Abstraction|Articles with example Java code |
随便看 |
|
开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。