Herencia Integrantes: Sun Guo Hua Luis Germán Pérez Edgar Ricardo López Galván 6-1 Introducción La herencia trata de hacer en el software: • Los diseñadores pueden crear nuevos módulos de software, esto evita rediseñar y codificar todo desde cero • Heredando el comportamiento, permitimos compartir código • La herencia también provee un mecanismo muy natural para organizar la información El modelo OO trata de modelar el mundo real. 6-2 Jerarquia de Herencia Persona Student Sales Person Images Secretary Employee Raster Vector Rectangle Hexagon • La relación de herencia liga a la clase(class) con la superclase. Las clases son organizadas de manera jerárquica, de la misma manera que la organización taxonómica de un zoológico en la organización del reino animal. 6-3 Representación de conocimiento • La herencia es la raíz del “sentido común” del paradigma de la representación del conocimiento, usado en la Inteligencia Artificial • Las redes semánticas consisten en nodos que representan conceptos “objetos” y ligas representa relaciones • Un ejemplo: es el modelo psicológico de Ross Quillian (1968) de la memoria asociativa, que fue uno de los primeros modelos de representación de redes semánticas del conocimiento. 6-4 Jefe de Distrito Persona Supervisa Es un Es un Jefe de Ventas Es un Cuenta Supervisa Tiene como Personal de Ventas Tiene como Orden Trabaja en Departamento Red Semántica para Personal de Ventas 6-5 • La herencia es justo una clase de relación entre conceptos. [Setrag 90] • Las relaciones pueden representar atributos (componentes) o conceptos (objetos). [Setrag 1990] Setrag Khoshafian, Object Orientation 1990 6-6 Beneficios de la herencia Reusabilidad de software: El comportamiento similar no tiene que ser reescrito. Compartir código: Muchos programadores pueden usar la misma clase, dos o mas clases son desarrolladas por un programador, heredado de una clase padre sencilla Consistencia de la interfase: Cuando se tiene múltiples herencias de una misma superclase, podemos asegurar que el comportamiento de la herencia es la misma en todas las clases 6-7 Componentes de software: La herencia permite construir componentes de software reusable. Prototipos rápidos: Mediante componentes de software reusable, el tiempo de desarrollo se emplea en la concepción del sistema. Polimorfismos: El polimorfismo junto con la herencia permite al programador generar componentes reusables en alto nivel que pueden ser usados para diversas aplicaciones con sólo cambiar algunas partes de bajo nivel. 6-8 Ocultamiento de la información: Cuando el programador reutiliza los componentes de software, ellos sólo necesitan entender la naturaleza del componente y su interfase. No es necesario que el programador tenga la información detallada de la clase heredada. 6-9 Herencia • Es le traslado de información que se pasa entre componentes de programa. • Es el mecanismo que permite que una clase A herede propiedades de una clase B. Decimos que “A hereda de B”. • Una forma temprana de herencia se encuentra en las reglas de alcance para datos estructurados en bloque. {int i,j; {float j,k ; k = i +j ;} } 6-10 • Aunque las reglas de alcance son una forma de herencia el termino se usa mas a menudo para referirse a el traslado de datos y funciones entre módulos independientes de un programa. • Si se tiene A => B, se dice que A es la clase progenitora o superclase, y B es la clase dependiente,niña o subclase. 6-11 • Si una clase sólo puede tener un único progenitor, se dice que tiene herencia sencilla • Si una clase puede tener múltiples progenitores, se dice que tiene herencia múltiple. A B U V C W D Herencia Sencilla X Y Herencia Múltiple 6-12 Mecanismos de heriencia • Herencia es el mecanismo de compartir artributos entre un hijo y su padre o progenitor,en la heriencia el hijo hereda algunos atributos del padre. • En los lenguajes OO un mecanismo natural de heriencia es extensión de atributos entre los objetos existentes. 6-13 Embebido • Embebido simplemente hace copias de los atributos del objeto donador. Lo que provee la más simple explicación de la semántica estándar de self como el receptor de una invocación. La invocación de un método heredado de esta menera , trabaja exactamente como la invocación de un método original. Mira la figura siguiente: aCell S e t aReCell Fijate:en aReCell, los métodos “set,reset” son redefinidos 0 Content Get Code for Get Set Code for Set c Content o n t Backup e n 0 0 Get Code for Get Set Code for Set Restore Code for restore Fig. Embebido 6-14 Delegando • Delegando es la redirección de campo y método invocado desde un objeto hasta otro, en un camino así, un objeto puede ser visto como una extensión de otro. Mira la figura siguiente aCell Content Get Set 0 Code for Get Code for Set aReCell Content 0 Backup 0 Set New Code for Set Restore Code for restore Fig. delegando 6-15 Herencia dinámica • La herencia delegando es llamada herencia estática cuando los enlaces de los progenitores son fijados permanentemente. Delegación dinámica es creada cuando los enlaces padres o progenitores pueden ser actualizados dinámicamente. aCell Content Get Set 0 Code for Get Code forSet 2 Content Get Other code forGet Set Other Code forSet aReCell Content Backup Set 0 0 New code for Set Restore Code for restore 6-16 Fig. Herencia dinámica Clasificación de herencia • En la teoría orientada a objetos, algunos conceptos fundamentales son: – – – – Class (clase) Objeto Método Tipo (datos) • Clasificación de la herencia – Herencia de tipos (encapsulamiento, datos abstractos) – Herencia de clases (class) y objetos – Herencia de métodos 6-17 • Se define a tipo de datos abstracto como un nuevo tipo de datos definido por el programador que incluye: – un tipo de datos definidos por el programador – un conjunto de operaciones abstractas sobre objetos de ese tipo, y – encapsulamiento de objetos de ese tipo, de tal manera que el usuario del nuevo tipo no pueda manipular esos objetos excepto a través del uso de operaciones definidas. 6-18 • En Ada un paquete proporciona encapsulamiento para un conjunto de definiciones de tipo y subprogramas. Package Tiposeccion is type IdEstutdiante is integer; type Seccion (TamañoMax: integer) is private; procedure AsignarEstudiante(Secc: in out Seccion; prof in integer; salon in integer); Private type seccion(TamañoMax: integer) is record salon: integer; profesor: integer; tamañodeclase: integer range 0..TamañoMax :=0; listadeclase: array (1..TamañoMax) of IdEstudiante; end record; end; Package body Tiposeccion is procedure asignarestudiante is ..... end; 6-19 End; • Modelos de implementación para datos abstarctos package A is package A is type Mipila is private; type MiPila is private: procedure PilaNueva (S:out miPila); procedure Pila Nueva(S: out MiPila): …. … Private private Type MiPila is record type MiPilaRep; Top: integer; ---- A: array ( 1..100) of integer; Detalles ocultos de MiPila Type MiPila is acces MiPilaRep; End record; ----- ---- B solo tiene apuntador a pila End; encapsulamiento indirecto B tiene estructura de pila End; encapsulamiento directo 6-20 Registro de activación Paquete A Registro de activación Paquete B Registro de activación Paquete A Registro de activación Paquete B P Encapsulamiento indirecto del objeto P P Encapsulamiento directo del objeto P 6-21 • Tipos de datos abstarctos genéricos Los tipos primitivos de datos integrados en un lenguaje, permiten declarar el tipo básico de una clase nueva y luego especificar atributos de los objetos de datos. Una definición genérica de tipo abstracto permite especificar por separado un atributo del tipo de esta clase. Una definición genérica de paquete representa una plantilla que se puede usar para crear tipos de datos abstractos particulares. 6-22 Generic type Element is private; Package Type Elem is private; Package TipoCualquierPila is type Pila (Tamaño:Positive) is private; procedure Push ( I: in elem; S: in out Pila); Private type Pila (Tamaño:Positive) is record AlmacenamientoPila: array (1 .. Tamaño) of Elem; Top: Integer range 0 .. Tamaño := 0; end record; End TipoCualquierpila; Package body TipoCualquierPila is procedure Push (I: in Elem; S: in out Pila) is begin -Procedimiento de cuerpo de Push end; procedure Pop ( I: out Elem; S: in out Pila) is begin -Procedimiento de cuerpo de Pop end; End TipocCualquierPila; 6-23 Al proceso de crear la definición particular del tipo a partir de la definición genérica se llama ejemplarización. Ejemplo package TipoPilaEnt is new TipoCualquierPila(elem => integer); Package TipoPilaEnte is type Pila(Tamaño: Positive9 is private; procedure Push ( I: in integer; S: in out Pila); procedure Pop (I: out integer; S: in out Pila); Private type Pila (Tamaño; Positive) isrecord AlmacenamientoPila; array (1 .. Tamaño) of integer; Top: Integer range 0 .. Tamaño :0 0; end record; End TipoPilaEnt; Package body TipoPilaEnt is procedure Push (I: in integer; S: in out Pila) is begin -Procedimiento de cuerpo de Push end Procedure Pop (I: out integer; S: in out Pila) is begin -Procedimiento de cuerpo de Pop end; End TipoPilaEnt; 6-24 • La clasificación de la herencia en los lenguajes OO, puede ser variable de acuerdo a diferentes autores, sin embargo la mayoría concide en dos aspectos importantes: – Herencia de estructura: Se refiere a los tipos de datos definidos en la clase y propiedades de los mismos. – Herencia de comportamiento: Se refiere a la herencia de funciones y procedimientos que forman parte del objeto. 6-25 OBJETOS Y MENSAJES • Smalltalk representa un enfoque hacia el desarrollo de objetos y métodos. • Un programa en Smalltalk se compone de un conjunto de definiciones de clase integradas por objetos de datos y métodos. Se compone de tres caraterísticas primordiales – Definiciones de la clase – Ejemplarización de objetos – Paso de mensajes 6-26 • Definiciones de clase. Son enunciados ejecutables que definen la estructura interna y los métodos. • Ejemplarización de objetos. Son objetos específicos para cada definición de clase invocando métodos de creación dentro de la definición de clase. • Paso de mensaje. Los métodos se pasan como mensajes a un objeto para llevar a cabo una acción. 6-27 • Existen 3 tipos de mensajes en Smalltalk: – Un mensaje unario es simplemente un método que no tiene parámetros – Un mensaje binario se usa principalmente para operadores aritméticos – Los mensajes de palabra clave que son funciones o procedimientos que se aplican dependiendo del objeto 6-28 • HERENCIA DE CLASES Los datos en Smalltalk se basan en una jerarquía de clases. Si un método que se pasa a un objeto no está definido dentro de esa clase, se pasa a la clase progenitora, y así sucesivamente. La clase OBJETO es la superclase progenitora de todas las clases. La herencia de métodos es una característica primitiva en Smalltalk 6-29 En los métodos de palabra clave, el parámetro para el método se nombra en forma explícita en la declaración: If True: Bloquecierto if False: Bloquefalso Pero qué pasa en x > 2 ? Para acceder al método > se tiene el objeto self (Se comporta como el parámetro this de C++) Ejemplo: Object subclass: #ClaseA Instace VariableNames:’’ Class VariableName:’’ PollDictionaries:’’ Category:nil! ClaseA subclases: #CaseB Instance VriableNames:’’ Class VariableNames:’’ PollDictionaries:’’ Categiry : nil! 6-30 Conceptos de abstracción La herencia proporciona un mecanismo para pasar información entre objetos y clases relacionadas. Si A => B significa que B es una clase relacionada con A Cuál es la relación entre objetos de A y objetos de B ? Respuesta: Especialización Descomposición Ejemplarización Individualización 6-31 Especialización Permite que el objeto derivado B obtenga propiedades más precisas presentes en el objeto A las Compuestos Pila Registro ............ Pila ent Pila real Es la forma más común de la herencia. 6-32 Descomposición Es el principio que permite separar una abstracción en sus compenentes Es el mecanismo típico de encapsulamiento en lenguajes como Ada sin la herencia de métodos. pila tope Almacenamiento[100] 6-33 Ejemplarización Es el proceso de crear ocurrencias de una clase. Un ejemplo es la declaración de ocurrencias de un objeto de clase en un programa en C++ Pila Pila A Pila B Pila C 6-34 Individualización Los objetos similares se agrupan unos con otros para propositpos comunes. Pila Registro act Reg. act C Tabla símbolos Reg. act Pascal 6-35 Metaclases Una clase contiene la descripción de la estructura y el comportamiento de la instancia. En la mayoría de los lenguajes OO, las clases son fábricas que crean e inicializan instancias. EJEMPLO Smalltalk: una instancia de una clase C es creada a través del mensaje new. iC := C new 6-36 En la mayoría de los lenguajes OO las clases son fábricas que crean e inicializan objetos En Smalltalk la clase es tratada como un objeto que puede crear instancias de otros objetos. Algunos lenguajes OO existen dos tipos de objetos: Objetos clase: Objetos que pueden actuar como modelo y crear instancias de ellos mismos Objetos terminales: Objetos que solamente pueden ser instanciados pero no pueden crear instancias para otros objetos. 6-37 Quién o que clase describe el estado y comportamiento de una clase como objeto, dicho de otra manera, que es la clase de una clase? Metaclases: Son clases para dar origen a clases (No todos los lenguajes soportan el concepto de metaclase) 6-38 Dos ventaja al tratar las clases como objetos 1. Pueden ser usadas para almacenar un grupo de información, si la clase es tratada como un objeto, la información global de todas las variables instanciadas de la clase puede ser almacenada en una clase “class instance variable” (llamada class variable en Smalltalk). Métodos asociados con la clase (llamados class methods) pueden ser usados para extraer o actualizar los valores de la class variable. 2. Uso en la creación e inicialización de nuevas instancias de la clase. 6-39 Existen lenguajes OO que persiguen en el soporte de metaclases lo siguiente: 1. Soporte explícito para crear e instanciar metaclases 2. Soporte implícito de metaclases. 6-40 Ejemplo de soporte explícito en OBjVLisp (send Classs’new :name :supers :i_v ‘() :methods ‘()) ‘metacomplex ‘(Class) (send Metacomplex’new :name ‘complex :supers ‘(object) :i_v ‘(real imaginary) :methods ‘(...) ... = 6-41 Ejemplo de soporte implícito: En Smalltalk las metaclases no definidas ni creadas explicitamente. Las metaclases en Smalltalk están ocultas para el usuario. Son usadas y estan definidas en la implementación del kernel del ambiente de Smalltalk. 6-42 * El modelo de Smalltalk-76 Fue el primer lenguaje en introducir el concepto de metaclases Lenguajes con el concepto de metaclases Smalltalk Languajes OO sin el concepto de metaclases: C++ Simula Eiffel Oject pascal 6-43 Herencia múltiple • Si la clase A hereda de más de una clase, p.ej. A hereda de B1, B2,... Bn, se dice que hablamos de herencia múltiple. • La herencia múltiple significa que una subclase puede tenera más de una superclase. • Esto permite que la subclase herede propiedades de más de una superclase y “mezclar” sus propiedades. 6-44 • La herencia múltiple presenta el siguiente problema: – Si una clase D hereda en forma múltiple de las superclases B,C que a su vez son derivadas de una superclase A y existen atributos o métodos con el mismo nombre, que atributos o métodos hereda D A B C D 6-45 Declaración de Tipos de Elementos en la definición de las Clases · Un elemento público (public), puede ser accedido por cualquier función del programa. · Un elemento privado (private), puede ser accedido por funciones miembro · Un elemento protegido (protected), puede ser accedido por funciones amigas Cuando una clase hereda de otra, los elementos privados de la clase base son inaccesibles a la clase derivada y cuando los elementos son te tipo protegido estos son accesibles. 6-46 Diferentes facetas de la herencia La herencia es una poderosa técnica que organiza bases de código complejo y es muy rica en la semántica de las relaciones sobre entidades. Pero esta introduce un poco de complejidad, especialmente con otros conceptos de la orientación a objetos como es la encapsulación, tipos, visibilidad y estados de los objetos A continuación se describirán cada una de estas facetas: 6-47 Herencia y Subtipos: En la mayoría de los lenguajes orientados a objetos los dos objetos son usados sin distinción. Visibilidad de variables heredadas y métodos: En muchos lenguajes orientados a objetos como Simula permiten la manipulación directa de las variables instanciadas. Otros lenguajes como C++ distinguen entre la manipulación pública y privada. Con la herencia tenemos una tercera alternativa, que demanda la visibilidad en la subclase. Herencia y Encapsulación: La visibilidad de las variables instanciadas violan el principio de ocultamiento de información ya que las variables de la superclase son accesadas directamente. Como se Especializa: La herencia es apropiado para la especialización de las clases existentes. Las clases pueden ser especializadas con extender su representación (instanciación de variables) o comportamiento (operaciones). 6-48 Herencia de Objetos: La mayoría de los lenguajes orientados a objetos soportan la herencia de clases. Se tienen varios modelos de de computación que incorpora operaciones con objetos y uso solamente con herencia de objetos para la organización de espacios de objetos. Esto es llamado sistema prototipo. Herencia Múltiple: En muchas situaciones es necesaria la herencia de más de una clase. A esto es llamado Herencia Múltiple. Cuando tenemos una clase heredera de más de un padre tenemos la posibilidad de conflictos: métodos o variables instanciadas con un mismo nombre pero con semántica diferente o no relacionada que son heredadas de diferentes superclases. 6-49 Tipo de Dato Protegido “Protected” Protected es el nivel intermedio de protección entre el acceso público y el acceso privado. Los miembros y “friend” de la clase base, y los miembros y “friend” de las clases derivadas son los únicos que pueden acceder a los miembros “protected” de una clase. Protected rompe con el encapsulamiento. 6-50 Clase Amigo “Friend” Las clases amigo pueden acceder a elementos declarados en la parte privada “private” y protegida “protected” de la clase a la cual declaro como amigo. En C++ se declaran a las clases amigo con la palabra reservada “friend”. También con esta palabra se pueden declarar a funciones como amigo. Esto se utiliza principalmente para la sobrecarga de operadores. 6-51 Ejemplo: Clases amigo. Class A { friend class AB; public: void mete_a(int aa) { a = aa; } private: int a; }; Class AB { public: void mete_b (int bb) { b = bb; } void escribe_ab (A aa); private: int b; }; 6-52 # include <iostream.h> void AB::escribe_ab(A aa) { cout << aa.a << “ “ << b; } void main () { A obj1; B obj2; obj1.escribe_a(1); obj2.escribe_b(2); obj2.escribe_ab(obj1); } 6-53 Sobrecarga de operadores: #include <iostream.h> class complejo { friend ostream &operator(ostream&, const complejo&); public: .... private: int real, imaginario; }; ostream &operator << (ostream &output, const complejo &numero) { output << real << “+” << imaginario << “i”; return output; } void main () { complejo numero; .... cout << numero; ... }; 6-54 Tipos de información que se hereda Herencia public public public es la clase derivada protected protected es la clase derivada private private es la clase derivada Herencia protected protected es la clase derivada protected es la clase derivada private es la clase derivada Herencia private private es la clase derivada private es la clase derivada private es la clase derivada Cuando la herencia es de tipo Public, los tipos quedan iguales. Cuando la herencia es de tipo protected, la parte pública y protegida de los elementos heredados quedan de tipo protected. Cuando la herencia es de tipo private, la parte pública y protegida de los elementos heredados quedan de tipo private. 6-55 • La herencia en C++ entre clases y subclases está soportada a través de las clases derivadas. • La declaración general de la forma de las clases derivadas es: class < derived-class-name> : [ public | private] < base-class-name> { < derived-class-members> } 6-56 • Miembros protegidos class X { protected: int i; } class Y : public X { Afunc () {i++}; } X Anx; Y Ay ... Anx.i =1; // Error Ay.i = 2; // Error 6-57 • Herencia múltiple class < new-derived-class>: [virtual][public | private] <base-class2>…} { … } class A class B { { public: public: int a; } int b; } class C: public A, public B { int c: f () {a = 5; b=6; c=8; } 6-58 6-59 6-60 Eiffel class FIXED_LIST[G] inherit LIST[G]; ARRAY[G] export feature ...Specific features of fixed-size lists... end --- class FIXED_LIST LIST ARRAY FIXED_LIST class C inherit A rename x as x1, y as y1 end; B rename x as x2, y as y2 end feature ... 6-61 class FIXED_TREE[T] inherit TREE[T] redefine attach_to_higher, higher end; CELL[T]; FIXED_LIST[like Current] rename off as child_off, after as child_after, before as child_before redefine duplicate, first_child end; feature ....(Rest of class omitted) ... 6-62 class Postbag export … inherit Bag Rename classify as classigyContent; Inventory Rename classigy as classigyBag; Feature … end – class Postbag Si BirminghamMail es una instancia de Postbag, las dos rutinas heredadas pueden por lo tanto ser usadas sin conflicto: Birminghammail . Create ; BirminghamMail. ClassifyContent; BirminghamMail. classigyBag 6-63 ObjectPascal Type aclass = Object ( NSObject ) public size : integer; private itsdata : integer; procedure set_its_data( p: integer); end; Procedure aclass.set_its_data( p : integer ); begin itsdata := p; end; Var aninstance : aclass; begin ... aninstance.amethod(aninstance.size); ... end; 6-64 6-65 6-66 Java Java provee una palabra reservada para implementar la herencia, esta palabra es “extends”. Java no tiene herencia múltiple. Sintaxis de la herencia sencilla: public class “Nombre de la clase” extends “acceso nombre de la clase” Ejemplo: 6-67 Delphi . Delphi, implementa sólamente la herencia sencilla . Cuando se comienza un nuevo proyecto se utiliza la herencia. Sintaxis: “Nombre de la clase” = class ( “acceso nombre de la clase”) Ejemplo 1. TForm1 = class (TForm) Ejemplo 2. type TMotorVehicle = class; public function Starten : Boolean; Virtual; end; type TMotorCycle = class (TMotorVehicle); public function Starten : Boolean; Override; end; 6-68 type TAnimal = class public constructor Create; function GetKind : string; function Vaice : string; virtual; abstract; private Kind : string; end; Tdog = class (TAnimal) public constructor Create; function Voice : string; override; function Eat : string; virtual; end; TCat = class (TAnimal) public constructor create; function Voice : string; override; function Eat : string; virtual; end; end; 6-69 type TTest = class protected ProtectedData : Integer; public PublicData : Integer; function GetValue : string; end; function TTest.GetValue : string ; begin Result := Format (‘Public : %d, Protected : %d’, [PublicData, ProtectedData]); end; procedure TForm1.Button1Click(Sender : Tobject); var Obj :TTest; begin Obj := TTest.Create; Obj.PublicData := 10; Obj.ProtectedData := 20; // No se compila ShowMessage (Obj.GetValue); Obj.Free; end; 6-70 Smalltalk En Smalltalk todo los elementos del programa son objetos, los cuales son creados heredados de una superclase principal llamada “object”. Sintaxis: Nombre_de_la_superclase subclass: # Nombre_de_la_clase Ejemplo. humano subclass: # estudiante object humano estudiante 6-71 Perl #-----------------------------package Employee; #Base class #-----------------------------sub allocate{ my ($pkg, $name, $age, $starting_position) = @_; my $r_employee = bless { “name” => $name, “age” => $age, “position” => $starting_position }, $pkg; return $r_employee; } sub promote { my $r_employe = shift; my $current_position = $r_employee-> {“position”}; my $next_position = lookup_next_position($current_position); $r_employee->{position} = $next_position; } 6-72 #-----------------------------package HourlyEmployee; #-----------------------------@ISA = (“Employee”); # Inherits from Employee sub new{ my ($pkg, $name, $age, $starting_position, $hourly_rate, $overtime_rate) = @_; #Let the employee package create and bless the object my $r_employee = $pkg -> allocate ($name, $age, $starting_position); #Add HourlyEmployee-specific attributes $r_employee->{“hourly_rate”} = $hourly_rate; $r_employee->{“overtime_rate”} = $overtime_rate; return $r_employee; } …. 6-73 use Single (); use Nested (); use Multi (); use strict; ######################################################### # Simple single inheritance: Creating a "Single" object. print "\n-------------------\n"; print "SINGLE INHERITANCE.\n"; print "-------------------\n"; my $singleObj = new Single (-base=>'Base data', -single=>'Single data' ); print "\nDISPLAYING OBJECT:\n"; print "----------------\n"; $singleObj->display(); ######################################################### # Nested single inheritance: Creating a "Nested" object. print "\n\n--------------------------\n"; print "NESTED SINGLE INHERITANCE.\n"; print "--------------------------\n"; my $nestedObj = new Nested (-base=>'Base data', -single=>'Single data', -nested=>'Nested data' ); print "\nDISPLAYING OBJECT:\n"; print "----------------\n"; $nestedObj->display(); print "\nINVOKING A DISTANTLY INHERITED FUNCTION:\n"; print "----------------------------------------\n"; $nestedObj->baseFunction(); 6-74 ######################################################### # Multiple inheritance: Creating a "Multi" object. print "\n\n--------------------------\n"; print "MULTIPLE INHERITANCE.\n"; print "--------------------------\n"; my $multiObj = new Multi (-base=>'Base data', -base2=>'Base2 data', -multi=>'Multi data' ); print "\nDISPLAYING OBJECT:\n"; print "----------------\n"; $multiObj->display(); print "\nINHERITED FUNCTIONS:\n"; print "--------------------\n"; $multiObj->baseFunction(); $multiObj->base2Function(); 6-75 Simula Class Plane; Begin RegisterFlightPlan; FillUpTank; Checklist; Inner; AskForTakOffPermission; End Plane; Plane class PostalPlane; Begin LoadPostalBags; End PostalPlane; Plane class Airliner; Begin PassengerBoarding; End Airliner; 6-76 Bibliografia Terrence W. Pratt, Marvin V. Zelkowitz Lenguajes de programacion, Diseño e Implementacion Prentice Hall Setra Khoshafian, Ramzmik Abnous Object Orientation, Cencepts, Lenguages, Databases, User Interfaces John Wiley Gerald Masini, Amedeo Napoli Object Oriented Lenguages The APIC series 34 Bertrand Mayer, 1992 Eiffel: the lenguage Prentice Hall Zhanshan Gao The University of Calgary http://sern/ucalgary/ca/courses/SENG/609.03/W98/gao2/paper.html 6-77 Timothy Budd An intruduction to Object-Oriented Programing Addison- Wesley Sriram Srinivasan, 1997 Advanced Perl programing O´Reilly Marco Cantu La bibli de Delphi 5 Anaya multimedia Zhanshan Gao The University of Calgary http://sern/ucalgary/ca/courses/SENG/609.03/W98/gao2/paper.html 6-78
© Copyright 2024