Sei sulla pagina 1di 32

Programaci amb C# .

NET

Tema 4 (a): Introduccin a la POO

Jordi Linares i Pellicer

ndice
! ! ! ! ! !

Antecedentes histricos Razones para usar OO Paradigmas de programacin Nocin de Objeto Conceptos en la OO Lenguajes OO

Antecedentes histricos
"

La aparicin de OO refleja y resume la historia de la computacin como un todo. La POO son un conjunto de tcnicas que nos permiten mejorar enormemente el proceso de produccin de software Simula 67, conceptos de clase y herencia. El trmino Orientado a Objetos se introdujo con Smalltalk (70, PARC) El ltimo gran paso lo da Bjarne Stroustrup en 1986 creando el C++, definido en su libro: The C++ Programming Language

"

" "

"

Idea bsica
Manejar los datos y los procedimientos en una nica entidad: el objeto. Un programa es un objeto, que a su vez est formado de objetos.

Razones para usar OO


" " " "

Aumento de productividad: reutilizacin Manejo de la complejidad Calidad Mantenibilidad

Reutilizacin vs. SW tradicional:


"

Se construyen componentes NICOS Y NO INTERCAMBIABLES.


! se

ensamblan a mano ! dificultad para entender el cdigo realizado por otros para extender y refinar el producto.
"

Raramente sobreviven y evolucionan (al menos) 10 aos.


! No
"

son adaptables a los entornos cambiantes:


incremento del potencial Hardware, SO, expectativas de usuarios, etc.

Reutilizacin del SW en OO
"

La OO enfatiza la reutilizacin
! uso

de libreras de componentes, en particular a travs de conceptos como encapsulacin y herencia. ! los componentes tienden a tener una alta cohesin semntica por el encapsulamiento de cdigo y datos. ! utiliza la tcnica de desarrollo incremental e iterativo. ! tcnicamente la reutilizacin es ms fcil, aunque no se garantice!.

Paradigmas de programacin
"

Paradigma Imperativo (1)


! Expresa

algoritmos que se realizan basados en el funcionamiento de la arquitectura Von Neumann. ! Los datos se almacenan en variables (referencias abstractas de una direccin de memoria) y las operaciones se llaman instrucciones. ! Su realizacin es llamada ejecucin.

! La

ejecucin de un PROGRAMA IMPERATIVO parte de un estado inicial (Ei) y termina en un estado final (Ef). paso del estado inicial al estado final se realiza mediante una serie de transiciones que se producen al ejecutarse las instrucciones del programa de forma secuencial.

! El

! El

paradigma se completa con otras caractersticas que dan mayor flexibilidad de clculo:
" "

tipos de datos y declaraciones instrucciones de control de flujo y condicionales, etc.

" Paradigma
! Un

Orientado a Objetos

OBJETO es un ente autnomo que pertenece a una cierta CLASE que define su estructura y las operaciones utilizables. ! En el paradigma imperativo se crea una jerarqua de programas, mdulos o subrutinas que utilizan los datos. ! En el paradigma OO la jerarqua la forman los objetos.

Nocin de Objeto
"

Un objeto integra comportamiento y estado en una sola unidad de razonamiento y de programacin: comportamiento + estado = objeto

Los objetos representan una cosa del mundo real, por ejemplo, una cuenta bancaria
M3 M2 Objeto 1 M1

M4

Interactan entre s por el paso de mensajes...


M4 M3 Object 1 M1 M2

mensaje 2
M2 Object M3 2 M1 M4

mensaje 1
M3 M2 Object 3 M1 M4

mensaje 3

Nocin de Objeto

Los objetos ocultan detalles de implementacin...

Cta_banco : extraer depositar :

Array : agregar buscar :

Coche : repostar alquilar :

El cliente ve slo la interfaz

Los objetos heredan (reutilizan) propiedades de objetos ms genricos


M4 M1 M3 M2
Persona

nombre direccin obtenerEdad()

Propio activo pasivo calcular%()


M4
Cliente

Heredado
M3 M2

nombre direccin obtenerEdad()

M1

En definitiva, los objetos:


"

Representan una parte del mundo real, algo tangible, visible. Encapsulan la parte esttica (datos) y la dinmica (funciones). Se comunican a travs del paso de mensajes. Pueden heredar atributos y comportamiento de otros objetos. Estructura y comportamiento de objetos similares se define en su clase comn.

"

" " "

Conceptos en la OO
" " " " " "

Clases y Objetos Abstraccin Encapsulacin Herencia Comunicacin interobjetual Polimorfismo

" Clases
! Una

y Objetos

clase se puede considerar como una descripcin genrica (en cuanto a estructura y comportamiento) para un conjunto de objetos. la clase se declaran todas las propiedades (estticas y dinmicas) de los miembros que pertenecen a esa clase. objeto es un ejemplar de una clase determinada.

! En

! Un

! Los
"

objetos se caracterizan por:

Identidad: Los objetos se distinguen unos de otros " Comportamiento: Los objetos pueden realizar tareas " Estado: Los objetos contienen informacin

! Instanciacin

Es la operacin que permite la creacin de representantes fsicos de las clases: Objetos, instancias, ejemplares, ...

Ejemplo de instanciacin:
CLASE: PERSONA ------------------------Nombre, Direccion, Edad ------------------------ObtenerEdad

Persona Jos Perez c/ Reus 35, 27 ObtenerEdad()

Persona Juan Daz c/ Coln 7, 35

...

...

ObtenerEdad()

"

Abstraccin
! Visin

simplificada de cierta parte de la realidad, que realza ciertos detalles o propiedades y suprime otros. ! Permite la eleccin de los detalles esenciales y centrarse en ellos. ! Bsica para disear software de calidad.
"

Encapsulacin
! Un

objeto puede tener una interface pblica y una representacin privada claramente diferenciadas. ! Los datos privados del objeto slo se permiten modificar a travs operaciones propiamente definidas. ! La encapsulacin de datos y sucesos es bsica en el paradigma objetual: permite el control y el cambio.

Ejemplo de encapsulacin:

"

Herencia ! Un conjunto de abstracciones a menudo se

relacionan en sus caractersticas y comportamientos, de tal forma que pueden agruparse en niveles, simplificando grandemente el entendimiento del problema. el principio por el cual se dice que el conocimiento de una categora ms general es aplicable tambin a la categora ms especfica. subclase es una clase que hereda comportamiento y estructura de otra clase (superclase).

! Es

! Una

! La

subclase puede aadir sus propias propiedades. ! Herencia mltiple: una subclase hereda de ms de una superclase.

Ejemplo 1:
CLASE C

CLASE A

superclase

CLASE B

subclase

CLASE D

D es un C

CLASE E

E es un D y tambin un B

Ejemplo 2

Escrito

Autor Ttulo

Libro

Editorial Precio

Artculo

Revista Fecha

Comunicacin interobjetual
" " "

" "

Un objeto accede a otro envindole un mensaje Cuando eso ocurre, el receptor ejecuta el mtodo correspondiente al mensaje Un mensaje consiste en un nombre de mtodo ms cualquier argumento adicional que es enviado por un objeto (cliente) a otro (servidor) El conjunto de mensajes a los que un objeto responde caracteriza su comportamiento El mtodo asociado a un mensaje es el algoritmo detallado que lo implementa (privado).

Polimorfismo
"

Cualidad que poseen los objetos para responder de distinto modo ante el mismo mensaje. Implica que el objeto que enva un mensaje no necesita conocer la instancia de la clase receptora. Permite detectar y aprovechar similitudes entre distintas clases de objetos: objetos distintos que respondan a un mismo mensaje pueden ser tratados de la misma forma por el remitente.

"

"

Ejemplo:
Polgono mover() area()

Tringulo

area()

Rectngulo

area()

Lenguajes OO
"

" "

" "

En 1986, E. Stroustrup extendi el lenguaje de programacin C a C++, es decir C con conceptos de clases y objetos, tambin por esas fechas se creo desde sus bases el lenguaje EIFFEL. En 1995 apareci el ms reciente lenguaje OO, Java desarrollado por SUN, que hereda conceptos de C++. El lenguaje de desarrollo ms extendido para aplicaciones Web, el PHP 5, trae todas las caractersticas necesarias para desarrollar software orientado a objetos. Adems de otros lenguajes que fueron evolucionando, como el Pascal a Delphi. Finalmente tambin otros lenguajes script como el ActionScript que si bien no es totalmente orientado a objetos pero s posee algunas caractersticas.

Programaci amb C# .NET


Tema 4 (b): Programacin Orientada a Objetos con C#
Jordi Linares i Pellicer

ndice
! ! ! ! ! ! ! !

Introduccin Espacios con nombre (Namespaces) Definicin de Clases Miembros de una clase Interfaces Sobrecarga de operadores Clases Parciales Clases Estticas

Introduccin
!

Tradicionalmente el cdigo se reutilizaba por el sistema de cortar aqu y pegar all:


" " "

Manual Difcil mantenimiento posterior Nunca se acaba de cerrar nada

Los objetos permiten encapsular datos y mtodos, herencia, polimorfismo, interfaces, C# es un lenguaje orientado a objetos. Se estudiar cmo crear clases propias para utilizarlas creando objetos, as como otros conceptos relacionados con la programacin orientada a objetos (POO).

! !

Espacios con nombre (Namespaces)


!

En la plataforma .NET todos los objetos se organizan en espacios con nombre. Un espacio con nombre define un grupo de miembros distintos, o mbito, que comparten un nombre y un propsito comn. Un espacio con nombre puede contener a otros espacios con nombre dando lugar a una jerarqua:
System
Windows Forms Web Services UI

Definicin:

namespace Espai1 { class Classe1 { ... } } namespace Espai1 { namespace SubEspai1 { class Classe2{} } }

Namespaces anidados:

Acceso cualificado a las definiciones de los namespaces:


! !

Espai1.Classe1 System.Console.ReadLine();

Using permite hacer referencia a namespaces:


! ! !

Using System Using System.Windows.Forms Using System.Console # ERROR, porque Console es una clase

Dos clases pueden tener el mismo nombre pero en espacios de nombre diferentes, en ese caso, se han de usar referencias completas o usar un alias. Ejemplo:
namespace MaClasses { namespace Espai1 { public class Mostra { public void MostraMissatge() { } } namespace Espai2 { public class Mostra { public void MostraMissatge() { } } }

Console.WriteLine(Hola des de Espai1.Mostra");

Console.WriteLine(Hola des de Espai2.Mostra ");

using System; using MaClasses.Espai1; // con alias: using Esp1 = MaClasses.Espai1 using MaClasses.Espai2; // con alias: using Esp2 = MaClasses.Espai2 namespace App1 { class ClasseExemple { [STAThread] static void Main(string[] args) { // Mostra m = new Mostra(); # Error por referencia ambigua // Tenemos que usar una referencia completa la clase: MaClasses.Espai1.Mostra m = new MaClasses.Espai1.Mostra(); m.MostraMissatge(); // o podemos usar tambien un alias si lo hemos definido Esp2.Mostra k = new Esp2.Mostra(); k.MostraMissatge(); }

Definicin de Clases
! !

Las clases permiten crear nuevos tipos de datos. Las clases se definen dentro de un namespace mediante la palabra clave class seguida del identificador de la clase. A diferencia de los dems tipos de datos las clases pueden derivarse unas de otras. Contienen datos, mtodos y propiedades Una clase puede incluir otras clases. Las clases pueden implementar interfaces. Tambin pueden incluir delegados y eventos.

! ! ! ! !

Modificadores de acceso:
public protected La clase o miembro es accesible en cualquier mbito. Se aplica slo a miembros de la clase. Indica que slo es accesible desde la propia clase y desde las clases derivadas. Se aplica a miembros de la clase. Un miembro privado slo puede utilizarse en el interior de la clase donde se define, por lo que no es visible tampoco en clases derivadas. La clase o miembro slo es visible en el proyecto (ensamblado) actual. Visible en el proyecto (ensamblado) actual y tambin visible en las clases derivadas.

private

internal internal protected


!

Todas las clases derivan implcitamente de la clase base System.Object y heredan todos sus mtodos pblic y protected: Finalize(), Equals(), GetType(), ToString(),, etc.

Constructores y Destructores
"

En C# existen unos mtodos especficos para controlar la creacin (constructores) y la eliminacin de objetos (destructores). En C# si no se definen se heredan por defecto de System.Object. Los constructores tienen el mismo nombre de la clase y no devuelven ningn valor. Pueden tomar o no argumentos (constructor por defecto).
class MaClasse { public MaClasse() { // Codi del constructor per defecte } public MaClasse(int maEnt) { // Constructor con parmetro maEnt } }

" " "

"

Puede haber mltiples constructores en una clase (si cuenta con diferentes argumentos), pero cada clase slo puede contar como mximo con un destructor.

" El

destructor no retorna ningn valor y no tiene argumentos.


~MaClasse() { // Cdi del destructor. }

" El

constructor de la clase se ejecuta en el momento que se utiliza new para crear un nuevo objeto de esa clase. destructor de la clase se ejecuta para cierto objeto cuando ya no hay ninguna referencia a ese objeto. De ello se ocupa el recolector de basura (garbage collector) de la plataforma .NET. (ya no existe el delete en C#) hacer referencia explcita dentro de la clase al objeto que llama al mtodo usaremos this.

" El

" Para

" Ejemplo:
namespace POO { class Persona { string Nom, Cognoms; ushort Edat; // constructor per defecte public Persona () { Console.WriteLine("Constructor per defecte de } Persona.Sense arguments "); } } // constructor amb arguments public Persona(string Nom, string Cognoms, ushort Edat) { this.Nom = Nom; this.Cognoms = Cognoms; this.Edat = Edat; Console.WriteLine("Constructor de {0} {1}", Nom, Cognoms); } //Destructor ~~Persona() { Console.WriteLine("Destrut: {0} {1} ", Nom, Cognoms); Console.ReadLine(); } public void MostraDades() { Console.WriteLine("\nNom: {0}\nCognoms: {1}\nEdat: {2}", Nom, Cognoms, Edat); }

class Class1 { [STAThread] static void Main(string[] args) { Persona p, q; p = new Persona(); q = new Persona("Pepe", "Prez", 23); p.MostraDades(); q.MostraDades(); Console.WriteLine("\n\n---Final de l'aplicaci---"); Console.ReadLine(); } }

Herencia
" " " " " "

Es el mecanismo para definir una nueva clase (clase derivada) partiendo de una clase existente (clase base) La herencia permite la reutilizacin de cdigo. La clase derivada hereda todos los miembros de su clase base, excepto los que son privados. Todas las clases derivan implcitamente de Object. C# slo permite heredar de una sola clase. Si una clase deriva de otra clase base se indica tras el nombre de la clase con dos puntos y el nombre de la clase de la cual deriva: <NomDer>:<NomBase> Para llamar al constructor de la clase base: public Quadrat(string nom) : base(nom){ }

"

" Ejemplo de herencia (derivacin)


class animal { // hereda de Object protected int peso=100; protected int talla=50; } class perro : animal {// perro hereda de la clase animal public void mostrarTodosDatos() { Console.WriteLine(peso.ToString() + " " + talla.ToString()); } }

desde Main():

perro p = new perro(); p.mostrarTodosDatos();

" Cuando

no interesa que se derive de una clase (porque se trata de una clase final) se usa el modificador sealed (sellada) delante de class: public sealed class perro : animal{...} clases de .NET Framework son selladas: String, StringBuilder, etc. cambio, si la clase slo debe actuar como clase base de otras clases se denomina clase abstracta y se usa el modificador abstract en la declaracin: public abstract class animal {...} # No es posible instanciar objetos directamente de una clase abstracta, es necesario derivar.

" Muchas " En

Miembros de una clase


!

En una clase se definen campos, propiedades y mtodos. Cada miembro tiene su propio nivel de accesibilidad: private, public, protected, internal, protected internal. Adems, los miembros definidos estticos (static) son compartidos por todos los objetos de la clase y se acceden directamente:
<nombreClase>.<nombreMiembroEstatico>

Campos
Se definen como las variables aadiendo su nivel de accesibilidad, adems de static y const opcionalmente. " Las variables estticas se acceden por la clase y nunca por instancias de la clase.
"
class MaClasse { public int MaEnt; //primera lletra en majscula public static int MaEntEstat; // public const int MaConst=120; // constant pblica }

Mtodos
" "

Se definen como las funciones indicando su nivel de accesibilidad y static de forma opcional.

Mtodos sobrecargados: permiten tener en una misma clase varios mtodos con el mismo nombre pero con diferentes argumentos. Se aplica tambin a los contructores. " A la definicin del mtodo pueden aadirse las palabras reservadas: virtual, abstract, override o extern.

" Ejemplo

de sobrecarga:

class ObjGeometrico { public static void Dibuixa(int x, int y) { // dibuixa en un punt } public static void Dibuixa(int color){ // pinta la pantalla de color } public static void Dibuixa(int x, int y, int color) { // dibuixa en un punt i ompli de color } } class Quadrat : ObjGeometrico { public static void Dibuixa(int x1, int y1, int x2, int y2) { // dibuixa un quadrat } public static void Dibuixa(int x1, int y1, int x2, int y2, int color) { // dibuixa un quadrat i l'ompli de color } }

"

Mtodos virtuales.
! ! !

Permiten que las clases sean polimrficas. Se usa la palabra clave virtual. Un mtodo virtual especifica una implementacin de un mtodo que puede ser sustituida por polimorfismo en una clase derivada. Un mtodo no virtual especifica la nica implementacin de un mtodo. No es posible sustituir por polimorfismo un mtodo no virtual en una clase derivada. Los mtodos virtuales no son ni estticos ni privados.
class ObjGeometrico { protected string nom; ... public virtual void Dibuixa(int x, int y) { // dibuixa lobjecte en la pos x,y } public string MostraNom() { return nom; } }

"

Sustitucin de mtodos (override):


!

Un mtodo override especifica otra implementacin de un mtodo virtual definido en una clase base. El mtodo override debe coincidir exactamente con su mtodo virtual heredado asociado. Un mtodo override se puede sustituir tambin en las clases derivadas.
class Quadrat : ObjGeometrico { public override void Dibuixa(int x, int y) { // nova implementaci del mtode // per a dibuixar el quadrat } public override string MostraNom() { return Quadrat + nom; } $ERROR MostraNom no es virtual!! }

"

Ocultacin de mtodos
!

! !

En ocasiones, un mtodo heredado no implementa en la clase derivada exactamente lo que se desea. Al redefinirlo, el mtodo de la clase base queda oculto. Se utiliza el modificador new en el mtodo de la clase derivada para indicar que se redefine el mtodo.

class ObjGeometricoImp: ObjGeometrico { new public static void Dibuixa(int x, int y) { // nova implementaci del mtode // oculta el mtode de la classe base Console.WriteLine(Punt a impressora); } }

Propiedades
" " "

" "

Aparecen en la clase como campos de datos. Las propiedades tienen un tipo, pero la asignacin y lectura de las mismas se realiza a travs de mtodos de lectura y escritura. Con las propiedades se puede limitar el acceso a un campo permitiendo slo la lectura y tambin se puede realizar cualquier comprobacin cuando se asignan valores a la propiedad. Con Intellisense de Visual Studio 2005 se inserta directamente una nueva propiedad: Insertar fragmento de cdigo#prop Ejemplo:
private string nombre; public string Nombre { get { return } set { nombre } } // camp privat // propietat pblica nombre; = value;

Propiedad de lectura / escritura

" "

Para indicar que una propiedad es de slo lectura o slo escritura hay que omitir el apartado set o get repectivamente. Ejemplo:
class Ficha { private string nombre; private int anyo; public string Nombre //propiedad de slo lectura { get { return El teu nom s: + nombre; } } public int Anyo //propiedad de lectura/escritura { get { return anyo; } set { if (value>1900) // comprovem si s correcte anyo = value; else Console.WriteLine(Noms anys >1900); } }

Interfaces
! ! ! ! ! ! ! !

Muchas veces al heredar de un objeto lo nico que queremos es que herede un comportamiento. Es decir, asegurarnos que implemente unos mtodos concretos para aplicar el polimorfismo. Tambin hay situaciones en las que nos gustara heredar de varias clases: pero C# no permite herencia mltiple. Una interfaz es la definicin de un conjunto de mtodos, propiedades, etc. para los que no se da implementacin pero que las clases hijas s que deben implementar. Una interfaz no contiene tipos, ni campos, ni modificadores de acceso (slo public) Al no tener implementacin los interfaces no se pueden instanciar. Una clase puede implementar varias interfaces separndolos por comas. Una clase ha de implementar todos los mtodos de interfaz heredados

Declaracin:
interface IPalClave { int NumLinea( ); string Palabra( ); }

Los nombres de interfaces empiezan con Imayscula

IPalClave interface NumLinea( ) Palabra( )

Mtodos sin cuerpo Sin especificacin de acceso

Ejemplo: Editor de formas geomtricas

Interfaces

" Definicin:

public interface IFigura


Interfaces

{ void Dibujar(); float Area(); float Perimetro(); }

public class Cuadrado : IFigura { protected float lado; public Cuadrado(float l) { this.lado=l; } public float Area() { return lado*lado; } public float Perimetro() { return 4*lado; } public void Dibujar() { System.Console.WriteLine("[]"); } }

public class Circulo : IFigura { protected float radio; protected const float PI=3.14159F; public Circulo(float radio) { this.radio=radio; } public float Area() { return PI*(float)Math.Pow(radio,2); } public float Perimetro() { return 2*PI*radio; } public void Dibujar() { Console.WriteLine("O");

public interface IFigura { void Dibujar(); float Area(); float Perimetro(); }

Interfaces

Obligacin de implementar todos los mtodos de la interfaz

"

Uso de las interfaces. Una interfaz puede hacer referencia a cualquier clase que la implemente:
Circulo fig1=new Circulo(1); Cuadrado fig2=new Cuadrado(2);
IFigura[] Figuras = new IFigura[2]; //array de interfaces IFigura f; //referencia a la interfaz f=fig1; f.Dibujar(); Console.WriteLine("PERIMETRO= + f.Perimetro() ); Console.WriteLine(AREA="+ f.Area() ); f=fig2; f.Dibujar(); Console.WriteLine("PERIMETRO= + f.Perimetro() ); Console.WriteLine(AREA= + f.Area() ); Figuras[0] = new Circulo(4); Figuras[1] = new Cuadrado(2);

Interfaces

Sobrecarga de Operadores
!

C# permite la sobrecarga de operadores para hacer algunas operaciones ms intuitivas: +, -, * , /, <,> etc. Hay que usarlo slo cuando su aplicacin resulta ms clara que con la llamada a un mtodo. Ejemplos:
" Sumar,

! !

restar, etc. dos arrays. " Operaciones con nmeros complejos. " Comparar cadenas usando >,<, etc.
!

Todos los operadores sobrecargados se definen public y static seguido del tipo devuelto, la palabra clave operator i el operador que se quiere sobrecargar.

Ejemplo: sumar y restar dos vectores de enteros


public Vector(params int[] v) { this.v = new int[v.Length]; for (int i = 0; i < v.Length; i++) this.v[i] = v[i]; } public static Vector operator +(Vector v1, Vector v2) { int[] minV, maxV; if (v1.v.Length > v2.v.Length) { minV = v2.v; maxV = v1.v; } else{ minV = v1.v; maxV = v2.v; } int[] suma = new int[maxV.Length]; int i,j; for (i = 0; i < minV.Length; i++) suma[i] = minV[i] + maxV[i]; for (j=i; j<maxV.Length;j++) suma[j] = maxV[j]; return new Vector(suma); } public override string ToString() { string s=""; foreach (int i in this.v) s += i + " "; return s; }

class Vector { int[] v;

static void Main(string[] args) { Vector v1 = new Vector(1,2,3,4); Vector v2 = new Vector(1,2,3,4,5,6); Vector v3 = v1 + v2; Console.WriteLine(v3.ToString()); Console.ReadLine(); }

Clases Parciales
!

Permiten dividir la definicin de una clase, estructura o interfaz en ficheros separados. Esto es lo que ocurre con el cdigo generado por Visual Studio. Es til cuando:
" " "

! !

Varios programadores quieren trabajar a la vez con la misma clase, El fichero se hace muy grande, Los mtodos se quieren tener por separado. //fichero ClasePart1.cs partial class ClaseParcial { public void Metode1() { } } //fichero ClassPart2.cs partial class ClaseParcial { public void Metode2() { } }

Definicin:

#Al compilar habr una clase ClaseParcial con dos mtodos.

Las Interfaces aplicadas a una clase parcial se aplica a todas las partes de la clase:
public partial class MaClasse : IMaInterface1 { .... } public partial class MaClasse : IMaInterface2 { .... }

equivale a:
public class MaClasse : IMaInterface1, IMaInterface2 { ... }

Clases Estticas
! !

Una clase esttica slo contiene miembros estticos. Una clase esttica nunca se instancia. Definicin:
static class ClasseEstatica { public static void MetodeEstatic(){..} }

Uso directo del mtodo:


ClasseEstatica.MetodeEstatic();

Potrebbero piacerti anche