Tecnología de Programación Diego C. Martínez Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes orientados a objetos Las ideas de la orientación a objetos no se limitan al código sino que procuran gobernar todo el proceso de construcción del software. analistas diseñadores programadores testers Por esa razón, el lenguaje de programación utilizado debe acompañar el esfuerzo inicial permitiendo respetar el paradigma. Antes de profundizar sobre la orientación a objetos, veamos brevemente algunos lenguajes de programación populares. Nos centraremos en aquellas características orientadas a objetos que ya nos son familiares (clases, objetos, herencia, polimorfismo). A medida que conozcamos más del paradigma, iremos haciendo referencia a detalles de implementación en algunos de estos lenguajes. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Algunos de los lenguajes existentes.... 1C 1.PAK 2.PAK 20-GATE 3APL 473L Query 51-FORTH 4D A+ A++ A# .NET A# (Axiom) A-0 ABAP - Advanced Business Application Programming ABC ABC ALGOL ABLE ABSET ABSYS ACC Accent Ace DASL ACT-III Action! ACS - Action Code Script ActionScript Actor Ada - ISO/IEC 8652 ADMINS - Automated Data Methods for Information Naming Systems [1] ADS/Online AdvPL Afnix - Previously known as Aleph AID Algebraic Interpretive Dialogue Aikido AIMMS AION Alan ALC Assembly Language Common, IBM acronym for BAL Basic assembly language Aldor Alef - concurrent language used in early versions of Plan 9 Algae ALGO ALGOL - ALGOrithmic Language Alice Alphard AmigaE conventional architectures architectures Arc Arc - A Lisp dialect AREXX AMOS AMPL ApeScript APL - ISO 8485 AppleScript Apply - A domain-specific language for image processing on parallel or conventional - Amiga version of REXX scripting language ARS++ Active Server Pages AsmL - The Abstract State Machine Language from Microsoft ASP AspectJ Assembly language ATLAS Atlas Autocode ATOLL - Acceptance, Test Or Launch Language Aubit-4GL Autocoder AutoHotkey AutoIt AutoLISP Averest AWK - Also derivatives gawk, mawk, and nawk Axiom Axiom-XL B BACI Baja BASIC - Beginners All-purpose Symbollic Instruction Code - See also List of BASIC dialects (by platform) bc bcompile BCPL BeanShell BETA Bigwig Big Snake Bistro BLISS Blitz Basic Block And List Manipulation (BALM) Blue - Rejected prototype for Ada Blue Boo Bourne shell - a.k.a sh Bourne-Again shell - see Bash Boxx BPEL Business Process Execution Language Brainfuck BUGSYS BuildProfessional BYOND C C-- C-script C++ - ISO/IEC 14882 C# - ISO/IEC 23270 C shell (csh) Caché ObjectScript - See also Caché Basic Caml Cat Cayenne C-BOT Cecil Cesil Cg Ch interpreter (C/C++ interpreter Ch) Chapel CHAIN Charity Chef Chey CHILL CHIP-8 chomski Chrome ChucK Cilk CICS environment CLU CLU CMS-2 CMS-2 COBOL - ISO/IEC 1989 o CobolScript Cobra CODE CL Clarion Clean Clipper CLIST - Programming language for online applications in the MVS TSO environment ColdFusion COMAL Common Intermediate Language (CIL) Common Lisp Component Pascal COMIT - List or string processing language Concurrent Clean Constraint Handling Rules CORAL66 Corn CorVision COWSEL CPL CSP Csound Cue Curl Curry Cyclone D Dao DASL - Distributed Application Specification Language DASL - Datapoint's Advanced Systems Language DarkBASIC DarkBASIC Professional Dataflex Datalog dBASE dc Deesel (formerly G) Delphi Dialect DCL Dialog Manager DIBOL DL/I Dream Maker Dylan Dynace Ease EASY Easy PL/I EASYTRIEVE PLUS eC (Ecere C) ECMAScript eDeveloper Edinburgh IMP Einstein Eiffel Elan elastiC Elf Emacs Lisp EGL Programming Language (EGL) Epigram Erlang Escapade - server-side programming Esterel Euclid Euphoria Euler EXEC EXEC2 F F# Factor Fan Felix Ferite F# FL FLOW-MATIC FOCAL FOCUS FOIL FORMAC Formula language Forth Fortran - ISO/IEC 1539 Fortress FoxPro FP Frag Script Franz Lisp Frink Frontier F-Script Gambas G-code General Algebraic Modeling System Generic Java Gibiane G (LabVIEW) Gödel Godiva GOTRAN (see IBM 1620) GPSS GraphTalk GRASS Green Groovy H HAL/S HAScript Haskell HDL High Level Assembly (HLA) Hoc Hugo HyperTalk HTML[2] IBM Basic assembly language IBM RPG ICI Icon IDL IMP Inform IPL Informix-4GL INTERCAL Io IPTSCRAE J J# J++ JADE JAG Jal Janus Java JavaScript Jim++ JCL JoeBASIC Join Java JOSS Joule JOVIAL Joy JScript JSP J2EE J2ME K KEE Kiev Korn Shell KIF Kite Kogut KRC KRL KRYPTON LabVIEW Lagoona LANSA Lasso Lava Leda Lead Leadwerks Script Legoscript Leopard Lexico Lfyre Liberty BASIC Limbo Limnor LINC Lingo Lisaac Lisp - ISO/IEC 13816 Lite-C Logo LOLCODE LPC LSL LSE Lua Lucid Lush Lustre LYaPAS M4 MAD MADCAP MAGIC - See eDeveloper Magik Magma MapBasic Maple MAPPER (Unisys/Sperry) now part of BIS M-A-R-E-K (Programming language) MARK-IV (Sterling/Informatics) now VISION:BUILDER of CA Mary Mathematica Matlab MATA Maxima (see also Macsyma) MaxScript internal language 3D Studio Max Maya (MEL) Multiprocessor C# Mercury Mesa METAL Michigan Algorithm Decoder see MAD programming language Microcode MicroScript MillScript MIMIC Mindscript Miranda Miva ML Moby MODCAP Model 204 User Language Modula Modula-2 Modula-3 Mondrian Mortran Moto MOUSE MSIL - Deprecated name for Common Intermediate Language MSL MUMPS Napier88 Natural Nemerle NESL Net.Data Neuralware NewtonScript NGL Nial Nice Nickle Nosica NQC Nu programming language o:XML Oberon Objective Modula-2 Object Lisp ObjectLOGO Object Pascal Objective-C Objective Caml Obliq Objectstar ObjectView Ocaml occam occam-p Octave OmniMark Opal Open programming language OPS5 Organiser Programming Language (OPL) - cf. Psion Organiser Oxygene Oz PARI/GP Parser Pascal - ISO 7185 Pawn PBASIC PCASTL PEARL Perl o Perl Data Language PHP Pico Piet Pike PIKT PILOT Pizza PL 11 PL/0 PL/8 PL/B PL/C PL/I - ISO 6160 PL/M PL/P PL/SQL Plankalkül PLD Pliant PNGlish PPL POP-11 Poplog PORTRAN POSIX PostScript POVRay PowerBASIC Ppc++ Processing Prograph Progress 4GL Prolog o Turbo Prolog Promela Protheus PRO-IV Python Q Qi QtScript QuakeC QPL Quikcomp (for the Moonrobot XI) R R++ - Based on C++ and added semanteme description Rascal Ratfiv Ratfor RBScript rc REALbasic REPL - Really Easy Programming Language REBOL - Relative Expression Based Object Language Red - Rejected prototype for Ada Redcode REDO REFAL Revolution REXX Rigal Rlab Robot Scripting Language (RSL) RPG - Report Program Generator RPL Ruby Russell Programming Language S S2 S-PLUS S-Lang SAIL SAKO SAM76 SAS Sather Scala ScalPL SCAR SCATRAN Scheme Scilab Script.NET Sed Seed7 Self SETL Shadow Programming Interface (Developing) Shift Script SIGNAL SiMPLE SIMPOL SIMSCRIPT Simula SISAL Slate SLIP SMALL - SMALL Machine Algol Like Language Small Smalltalk SNOBOL - String Oriented Symbolic Language o SPITBOL Snowball SPARK Spice SPIN SP/k SPL/1 - aka SPL/I SPS (1620) - see IBM 1620 Squirrel SR SSL Standard ML StringLang Subtext SuperCollider Suneido SYMPL SyncCharts Synergy/DE SystemVerilog T TACL TACPOL TagsMe TADS TIE Transaction Application Language Tcl Transact-SQL teco TELCOMP Telon Tempo thinBasic Titanium TI-Basic Today Tom TOM Topspeed - see Clarion TorqueScript tpu Trac Trine TTCN Turbo Pascal Turing TUTOR Tutorial D TXL Ubercode Ultra 32 Unicon Uniface Unix shell Unlambda UnrealScript Use V Vala Verilog VHDL Visual Assembler Visual Basic - Visual Beginners All-purpose Symbolic Instruction Code Visual Basic .NET Visual DataFlex Visual DialogScript Visual FoxPro Visual J++ Visual Objects VBScript VX-REXX Water WATFOR - see WATFIV WATFIV WAXHTML WebQL Whitespace Winbatch WinDev Windows PowerShell X10 XBL xbScript - Also xBaseScript xHarbour Departamento de Ciencias e Ingeniería de laX++ Computación - Universidad Nacional del XL SurXOTcl XPL XPL0 XQuery XSLT - See XPath Y YACC YAFL Yellow - Arbol genealógico de lenguajes de programación Primer astronauta Asesinato de JFK Guerra de Vietnam El hombre llega a la luna Se construye el WTC Nace Microsoft Nace Apple Se inventa el CD USSR lanza la MIR Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes Orientados a Objetos Los lenguajes orientados a objetos (LOO) pueden clasificarse en dos grandes grupos: • Lenguajes basados en clases (Class-Based Languages) • Lenguajes basados en objetos (Object-Based Languages) Los lenguajes basados en clases forman el grupo mayoritario de los LOO, e incluye a los más populares. Entre ellos, están los “históricos” - Simula, considerado primer lenguaje orientado a objetos. - Smalltalk, el primer lenguaje orientado a objetos con tipeo dinámico. - C++, descendiente de Simula, y ampliamente utilizado en la industria. - Java Analizaremos las propiedades básicas de este grupo de lenguajes. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes basados en clases Los lenguajes basados en clases (LBC) se centran en la noción de clase como descripción de los objetos. Una clase describe la estructura de todos los objetos generados a partir de esa clase. Ejemplo get() { Celda contenido: entero return contenido; } get(): entero; set(n:entero); set() { contenido=n; } Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes basados en Clases Los objetos son producidos a partir de la clase, la cual se interpreta como un esquema estructural de los objetos. La mayoría de los lenguajes poseen creación explícita de objetos, por medio de operaciones especiales denominadas constructores. Los constructores inician implicitamente el proceso de creación física del objeto (memoria) y proveen algunas sentencias de inicialización. celdita new Celda() En algunos lenguajes los objetos pueden destruirse por medio de operaciones especiales denominadas destructores, que inician el proceso de eliminación del objeto del sistema. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes basados en Clases La destrucción de los objetos puede ser explícita (con operadores como dispose) o implícita (garbage collector). En ambos casos el destructor es invocado. C++ permite la definición de destructores y Java posee el servicio finalize() en la clase Object. Usualmente los objetos suelen manipularse por medio de referencias (semántica por referencia) aunque algunos lenguajes admiten objetos expandidos (semántica por valor). - Java utiliza únicamente referencias. - Eiffel permite objetos por valor (subobjetos). Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes basados en objetos Los lenguajes basados en objetos pretenden ser más simples y más flexibles que los lenguajes basados en clases. Aunque existen varios lenguajes, sólo uno es muy populares en la industria. Proveen únicamente la noción de objeto y despacho dinámico. No existe la noción de clase y por ende la de constructores como mecanismo de creación de objetos individuales En los lenguajes basados en objetos, se define el tipo del objeto como interfaz, y se implementan las operaciones en la declaración misma del objeto. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes basados en objetos Ejemplo [Abadi-Cardelli] : ObjectType Cell is var contents: Integer; method get(): Integer; method set(n:Integer); end; object unaCelda:Cell is var contents: Integer := 0; method get(): Integer is return self.contents end; method set(n: Integer) is self.contents := n end; end; Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Aquí se define el tipo Cell Aquí se declara un objeto unaCelda de tipo Cell Lenguajes basados en objetos Según [Abadi-Cardelli] el rol del constructor puede cumplirlo una operación como la siguiente: procedure newCell(m: Integer): Cell is object cell: Cell is var contents: Integer := m; method get(): Integer is return self.contents end; method set(n: Integer) is self.contents := n end; end; return cell; end; … var cellInstance: Cell := newCell(0); Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes basados en objetos No ahondaremos en las características intrínsecas de este grupo de lenguajes. Mencionaremos JavaScript y revisaremos algunas de sus características a título informativo, como ejemplo de lenguaje de esta categoría. Para mayor información ver A Theory of Objects Martín Abadi-Luca Cardelli Abadi y Cardelli desarrollan en este libro una teoría de objetos, como fundamento teórico de este paradigma. Introducen un cálculo basado en objetos, de bastante complejidad en sus niveles avanzados. Este cálculo captura la noción de objetos, tipos, subtipos, especialización de métodos, etc. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguajes OO Veremos una introducción y las definiciones básicas de clases, objetos y herencia en los principales lenguajes que poseen características de orientación a objetos... Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur C++ Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur C++ Entre los lenguajes más populares se encuentra C++. Incluso varios cursos de OO en otras universidades lo toman como lenguaje ejemplo. Algunas cosas nos serán familiares puesto que C++ es el antecesor de Java. Incluso nos parecerá un retroceso en algunos aspectos. De hecho en sus comienzos, a modo de introducción se decía que Java = (C++) - C++ fue creado por Bjarne Stroustup en 1979. Agrega nociones orientadas a objetos al lenguaje C, conservando los dos estilos de programación. Esto ha sido elogiado y criticado al mismo tiempo. Esto permitió la masificación de la OO en la industria, donde C ya era un lenguaje popular. Bjarne Stroustup Es uno de los lenguajes más utilizados en el mundo y ha influenciado a otros lenguajes, como Java y C# en varios aspectos. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Clases en C++ Una clase en C++ tiene una declaración y una definición o implementación. La declaración tiene el siguiente formato: class Nombre { // Cuerpo de la clase } El cuerpo contiene cero o más definiciones de miembros (datos o funciones). Los miembros pueden ser privados, públicos o protegidos. class Nombre { private: // Miembros privados public: // Miembros publicos protected: // Miembros protegidos } Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Clases en C++ En la declaración de la clase se incluyen los atributos y el signature o encabezado de las operaciones. Puede agregarse implementación, pero sólo de operaciones simples. En C++ la declaración de la clase y la definición no necesariamente están en un mismo archivo... miClase.h Declaración de datos y métodos + posibles implementaciones breves miClase.cpp Implementación de métodos Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Clases en C++ El formato de declaración de operaciones es: tipo Nombre-clase :: Nombre_función (argumentos) { // código } Las variables y objetos se declaran anteponiendo el tipo: float cantidad; boolean conexionActiva; CuentaBancaria cbu123AB Empleado lenny,karl; La sintaxis de las sentencias de control es prácticamente la misma que en Java! :) Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Clases en C++ : declaración e implementación class CuentaBanco { public: CuentaBanco(); float saldo_cuenta(); float retirar(float); void depositar(float); private: float saldo; } Archivo Cuenta.h CuentaBanco::CuentaBanco(){ saldo = 0.0; } float CuentaBanco::saldo_cuenta(){ return saldo; } float CuentaBanco::retirar(float c){ if (c<=saldo) { saldo = saldo – c; return c; } else { return 0; } void CuentaBanco::depositar(float c){ saldo = saldo + c; } Archivo Cuenta.cpp Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Creando objetos C++ tiene dos operadores new y delete cuyo objetivo es la creación dinámica de objetos. Empleado *homero; homero = new Empleado; Las llamadas calificadas (la invocación a métodos o atributos del objeto) se realizan utilizando el símbolo -> int edad = homero->edad(); Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Herencia en C++ En C++ la herencia suele denominarse también derivación de clases. Sustenta herencia simple y herencia múltiple. La sintaxis requerida es: class Padre { //codigo clase padre } class Hija: [public|private|protected] Padre { //codigo clase hija } Los modificadores de acceso en la declaración de la herencia permiten la redefinición de visibilidades de la clase padre. En todos los casos, las visibilidades permanecen igual, o se vuelven más restrictivas. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Herencia en C++ Derivación pública Acceso clase padre (base) public Acceso clase hija (derivada) public protected protected private no accesible Derivación protegida Acceso clase padre (base) public Acceso clase hija (derivada) protected protected protected private no accesible Derivación privada Acceso clase padre (base) public Acceso clase hija (derivada) private protected private private no accesible Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Ejemplo herencia – clase Habitacion class Habitacion { public: Habitacion(const int); ~Habitacion(); int size(void); private: int metros_cuadrados; }; Habitacion::Habitacion(const int n) { metros_cuadrados = n; } Habitacion::size() { return metros_cuadrados; } ... Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Habitacion.h Habitacion.cpp Ejemplo herencia – clase Oficina class Oficina : public Habitacion{ public: Oficina(const int, const int); ~Oficina(); void listarCapacidad(void); private: int capacidad; }; Oficina.h Oficina::Oficina(const int size, const int capa) : Habitacion(size) { capacidad = capa; } ... Oficina.cpp Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur C# Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Las redes como escenario de ejecución En los últimos 15 años surge un nuevo escenario de ejecución: las redes de computadoras. Los sistemas ya no residen en una sola PC, sino “fraccionado” en varias computadoras que en conjunto conforman el sistema completo. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Las redes como escenario de ejecución Han surgido diversas propuestas para desarrollar software en este escenario. Una es Java. Multiplataforma. Máquina virtual. Orientado a objetos. Otra propuesta diferente (pero para el mismo escenario) es .NET Máquina virtual, multiplataforma en potencia. Varios lenguajes, fáciles de integrar. Orientado a objetos en general. Uno de los lenguajes más populares de .NET es C#. Surge como una alternativa “estilo Java” para programar en el framework de Microsoft. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Hola Mundo... En Java class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } En C# class HelloWorld { public static void Main(string[] args) { System.Console.WriteLine("Hello, World!"); } } Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur C# y Java Definición de clases En Java class Foo extends Bar implements IFooBar { //cuerpo de la clase } En C# class Foo : Bar , IFooBar { //cuerpo de la clase } Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur C# y Java Referencia a la clase padre desde la clase hija En Java super.hashCode(); En C# base.HashCode(); Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur C# y Java Importación En Java import java.util; En C# using System.Net; Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Clase Persona en C# - component using System; class Persona { private string miNombre ="N/A"; private int miEdad = 0; // Declara una propiedad Nombre de tipo string: public string Name { get { return miNombre; } set { miNombre = value; } } // Declara una propiedad Edad de tipo int: public int Edad { get { return miEdad; } set { miEdad = value; } } } Persona p = new Persona(); p.Name = "Juan"; p.Edad = 34; … Console.Writeline(p.Edad); Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Java y C# Algunas similitudes adicionales: C# conserva el estilo Java de definición de visibilidad de operadores (por entidades y no por bloques como en C++) La sintaxis de las sentencias es la misma. Los dos son compilados a código intermedio. Los dos proveen un operador que permite averiguar la clase base de un objeto (Java: instanceof, C#: is). Los dos poseen casting para polimorfismo. Ninguno de los dos permite herencia múltiple. Los dos usan el modificador abstract para las clases y operaciones abstractas. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur VB.NET Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Historia de VB.NET Basic 1964 MS Basic 70's Visual Basic 1.0 1991 Visual Basic 6.0 1998 VB.NET 2000 50 FOR X=99 TO 1 STEP -1 60 PRINT X;"bottle"; 70 IF X<>1 THEN PRINT "s"; 80 PRINT " of beer on the wall,";X;"bottle"; 90 IF X<>1 THEN PRINT "s"; 100 PRINT " of beer" 110 PRINT "Take one down and pass it around," 120 PRINT X-1;"bottle"; ... Sub DisplayResults() Dim i% Do Form1.Cls If EndNow = True Then Exit Sub For i = 0 To UBound(Verse) With Verse(i) CurrentX = 20 ... Mejor modelo de objetos, integración con el framework .NET Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur VB.NET – Definición de clase En VB.NET una clase es una forma de tipo de dato. Define un conjunto de miembros: campos, propiedades, métodos y eventos. Public Class Employee Public EmployeeNumber As Integer Public FamilyName As String Public GivenName As String Public DateOfBirth As Date Public Salary As Decimal Public Function Format( ) As String Return GivenName & " " & FamilyName End Function End Class Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Acceso a datos y métodos Uso de la clase anterior: Dim emp As New Employee( ) emp.EmployeeNumber = 10 emp.FamilyName = "Grimes" emp.GivenName = "Frank" emp.DateOfBirth = #1/28/1965# emp.Salary = 115000 Console.WriteLine("Employee Name: " & emp.Format( )) Console.WriteLine("Employee Number: " & emp.EmployeeNumber) Console.WriteLine("Birth: " & emp.DateOfBirth.ToString("D", Nothing)) Console.WriteLine("Salary: " & emp.Salary.ToString("C", Nothing)) Employee Name: Frank Grimes Employee Number: 10 Date of Birth: Thursday, January 28, 1965 Salary: $115,000.00 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Herencia VBasic también permite herencia entre clases: Public MustInherit Class Shape Public Origin As Point Public Size As Extent Public MustOverride Sub Draw( ) Public Sub Offset(ByVal Amount As Extent) Origin.X += Amount.XExtent Origin.Y += Amount.YExtent End Sub … End Class Public Class Circle Inherits Shape Public Overrides Sub Draw( ) ‘dibujar circulo ! ! End Sub End Class Public Class Square Inherits Shape Public Overrides Sub Draw( ) ‘dibujar cuadrado! ! ! End Sub End Class Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur