Clases y estructuras (Guía de programación de C#

)
Visual Studio 2010 Otras versiones

Las clases y structs son dos de las construcciones básicas del Common Type System (CTS) en .NET Framework. Ambas son esencialmente un struct de datos que encapsula un conjunto de datos y comportamientos relacionados como una unidad lógica. Los datos y comportamientos son los miembros de la clase o struct e incluyen sus métodos, propiedades, eventos, etc., tal como se enumeran más adelante en este tema. Una declaración de clase o struct es como un plano que se utiliza para crear instancias u objetos en tiempo de ejecución. Si define una clase o un struct llamado Person, Persones el nombre del tipo. Si declara e inicializa una variable p de tipo Person, se dice que p es un objeto o una instancia de Person. Se pueden crear varias instancias del mismo tipoPerson y cada instancia puede tener diferentes valores en sus propiedades y campos. Una clase es un tipo de referencia. Cuando se crea un objeto de la clase, la variable a la que se asigna el objeto solo incluye una referencia a dicha memoria. Cuando la referencia a objeto se asigna a una nueva variable, la nueva variable hace referencia al objeto original. Los cambios realizados en una variable se reflejan en la otra variable porque ambas hacen referencia a los mismos datos. Un struct es un tipo de valor. Cuando se crea un struct, la variable a la que se asigna incluye los datos reales del struct. Cuando el struct se asigna a una nueva variable, se copia.La nueva variable y la variable original contienen por tanto dos copias independientes de los mismos datos. Los cambios realizados en una copia no afectan a la otra copia. En general, las clases se utilizan para modelar comportamiento más complejo o datos que se piensan modificar una vez creado un objeto de clase. Los structs son más adecuadas para pequeñas estructuras de datos que contienen principalmente datos que no se piensan modificar una vez creado el struct. Para obtener más información, vea Clases (Guía de programación de C#), Objetos (Guía de programación de C#) y Estructuras (Guía de programación de C#).

Ejemplo
En el ejemplo siguiente, se define MyCustomClass con tres miembros en el nivel superior del espacio de nombres ProgrammingGuide. Se crea una instancia (objeto) deMyCustomClass en el

Multiply(4). // Call a public method. una clase o un struct puede especificar el nivel posible de acceso a cada uno de sus miembros en el código fuera de la clase o el . public MyCustomClass() { Number = 0. C# namespace ProgrammingGuide { // Class definition. MyCustomClass myClass = new MyCustomClass(). } // Method. class Program { static void Main(string[] args) { // Create an object of type MyCustomClass. set. the entry point for the program. } } } Encapsulación En ocasiones se hace referencia a la encapsulación como el primer pilar o principio de la programación orientada a objetos. myClass. Para obtener acceso a los métodos y propiedades del objeto se utiliza la notación de punto. This one contains // the Main method. public int Multiply(int num) { return num * Number.Number = 27. } // Instance Constructor. public class MyCustomClass { // Class members: // Property. Según el principio de encapsulación. // Set the value of a public property. int result = myClass. public int Number { get. } } // Another class definition.método Main de la clase Program.

Es importante limitar la accesibilidad del código para que solo el código de cliente previsto pueda llegar a él. vea Modificadores de acceso (Guía de programación de C#). Para obtener más información. protected. Para obtener más información.En la lista siguiente se incluyen los diversos tipos de miembros que pueden declararse en una clase o en un struct. En C#. Los métodos y variables que no se van a utilizar fuera de la clase o el ensamblado se pueden ocultar para limitar la posibilidad de errores de codificación o ataques malintencionadas. Herencia Las clases (pero no los structs) admiten el concepto de herencia. Las clases pueden declararse como abstract. Para obtener más información sobre diseñar clases. éstas pueden actuar como clases base de otras clases que proporcionan la implementación que falta. protected internal y private. excepto sus constructores y destructores. La accesibilidad predeterminada es private. Una clase que deriva de otra clase (la clase base) contiene automáticamente todos los miembros públicos. vea Instrucciones de diseño de tipos. protegidos e internos de la clase base. conocido como código de cliente. La accesibilidad del código de cliente a los tipos y sus miembros se especifica mediante los modificadores de acceso public. no existen variables ni métodos globales como en otros lenguajes. propiedades y eventos se deben declarar dentro de un tipo. Incluso el punto de entrada de un programa. constantes. vea Clases (Guía de programación de C#) y Objetos (Guía de programación de C#). Puede que otros métodos y propiedades solo se utilicen en la propia clase o struct. Para obtener más información sobre las clases. se debe declarar dentro de una clase o struct.           Campos Constantes Propiedades Métodos Constructores Destructores Eventos Indizadores Operadores Tipos anidados Accesibilidad A algunos métodos y propiedades se les llama o se accede a ellos desde código fuera de su clase o struct.struct. campos. estos elementos se denominan miembros de la clase o struct. Las clases también pueden declararse como sealed para impedir que . vea Herencia (Guía de programación de C#) y Polimorfismo (Guía de programación de C#). lo que significa que uno o varios de sus métodos no tienen ninguna implementación. Miembros Todos los métodos. internal. Aunque no se pueden crear instancias de las clases abstractas directamente. el método Main.

Tipos parciales Puede definir parte de una clase. Al cargarse el programa se carga una copia de la clase en la memoria y se obtiene acceso a sus miembros a través del nombre de la clase. Heredar de una interfaz significa que el tipo implementa todos los métodos definidos en la interfaz.otras clases hereden de ellas. Para obtener más información. Por ejemplo. utilice . Inicializadores de objeto Puede crear instancias y colecciones de objetos de clase o struct. Tipos genéricos Las clases y los structs pueden definirse con uno o más parámetros de tipo. Para obtener más información. Para obtener más información. vea Genéricos (Guía de programación de C#). sin llamar a su constructor explícitamente. vea Interfaces (Guía de programación de C#). Tipos anónimos En situaciones en las que no es conveniente o necesario crear una clase con nombre. vea Inicializadores de objeto y de colección (Guía de programación de C#). vea Clases y miembros de clase abstractos y sellados (Guía de programación de C#).Generic se define con un parámetro de tipo. vea Tipos anidados. El código cliente crea una instancia de List<string> o List<int> para especificar el tipo que contendrá la lista. Tipos anidados Una clase o un struct se pueden anidar en otra clase o struct. e inicializarlos. El código cliente proporciona el tipo cuando crea una instancia del tipo. Para obtener más información. Para obtener más información. vea Clases estáticas y sus miembros (Guía de programación de C#). struct o método en un archivo de código y otra parte en un archivo de código independiente. Una clase estática solo puede contener miembros estáticos y no se pueden crear instancias de ésta con la palabra clave new. Interfaces Las clases y los structs pueden heredar varias interfaces.Collections. vea Clases y métodos parciales. Para obtener más información. la claseList(Of T) del espacio de nombres System. por ejemplo al rellenar una lista con estructuras de datos que no tiene que conservar o pasar a otro método. Tanto las clases como los structs pueden contener miembros estáticos. Para obtener más información. Tipos estáticos Las clases (pero no los structs) se pueden declarar como estáticas.

Para ello. Para obtener más información. Para obtener más información. Para obtener más información.En un lenguaje orientado a objetos como C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#. Variables locales tipificadas implícitamente En un método de clase o struct. un programa típico se compone de varios objetos que interactúan dinámicamente. programación de C#). vea Variables locales con asignación implícita de tipos (Guía de programación de C#). puede utilizar tipos implícitos para indicar al compilador que determine el tipo correcto en tiempo de compilación. vea Métodos de extensión (Guía de programación de C#). /////////////////////////////////// Objetos (Guía de programación de C#) Visual Studio 2010 Otras versiones Una definición de clase o struct es como un plano que especifica qué puede hacer el tipo. Un programa puede crear muchos objetos de la misma clase.Para obtener más información. vea Tipos anónimos (Guía de programación de C#). Nota Los tipos estáticos se comportan de manera diferente a la que se describe aquí. vea la Especificación del lenguaje C#. El código cliente es el código que utiliza estas variables para llamar a los métodos y obtener acceso a las propiedades públicas del objeto. cree un tipo independiente en el que se pueda llamar a sus métodos como si pertenecieran al tipo original.los tipos anónimos. Especificación del lenguaje C# Para obtener más información. Los objetos también se denominan instancias y se pueden almacenar en una variable con nombre o en una matriz o colección. Métodos de extensión. Un objeto es básicamente un bloque de memoria que se ha asignado y configurado en función del plano. Instancias de struct frente aInstancias de clase . Puede "extender" una clase sin crear una clase derivada.

una variable de un objeto de clase contiene una referencia a la dirección del objeto en el montón administrado.. de ese tipo. } class Program { static void Main() { Person person1 = new Person("Leopold".WriteLine("Press any key to exit.Age = 16.Name.Dado que las clases son tipos de referencia. and person1 also changes. en este mismo tema. person1. person2. assign person1 to it.WriteLine("person1 Name = {0} Age = {1}". Console.. int age) { Name = name.Name. Console. person1. methods.Name. Console. Console. Age). person2. person2. Si un segundo objeto del mismo tipo se asigna al primer objeto."). Person es el tipo y person1 y person C# public class Person { public string Name { get. set. person2. person1. } public Person(string name. //Change the name of person2. // Declare new person. // Keep the console open in debug mode. Age = age. Las instancias de clases se crean utilizando el operador new. 6). Este punto se analiza con más detalle más adelante. person1. } } /* Output: person1 Name = Leopold Age = 6 2 son instancias. u objetos. events. set. ambas variables hacen referencia al objeto en esa dirección. Age).WriteLine("person1 Name = {0} Age = {1}".Name = "Molly". Console. . Age). } public int Age { get. } //Other properties. En el ejemplo siguiente.WriteLine("person2 Name = {0} Age = {1}". Person person2 = person1.ReadKey().

p1.person2 Name = Molly Age = 16 person1 Name = Molly Age = 16 */ Dado que los structs son tipos de valor. Person p2 = p1. p2. int age) { Name = name. public Person(string name.Age = 7. Console. Console. // Keep the console open in debug mode. p1.WriteLine("p1 Name = {0} Age = {1}". struct can be initialized // Assign values to p2 members.WriteLine("p2 Name = {0} Age = {1}". // p1 values remain unchanged because p2 is copy. Console. 9). p1. p2. // Create new struct object. p1.WriteLine("Press any key to exit.Age). Console.ReadKey(). como se muestra en el ejemplo siguiente: C# public struct Person { public string Name. } } /* Output: p1 Name = Alex Age = 9 p2 Name = Spencer Age = 7 p1 Name = Alex Age = 9 .Age).Name. public int Age. También se pueden crear instancias de structs utilizando el operador new."). Note that // without using "new". Person p1 = new Person("Alex". pero no es obligatorio.Name = "Spencer".Age). Age = age.Name. } } public class Application { static void Main() { // Create struct instance and initialize by using "new". Console. una variable de un objeto de struct contiene una copia de todo el objeto. p2.WriteLine("p1 Name = {0} Age = {1}". // Memory is allocated on thread stack.Name. p2.

primero debe diferenciar si desea conocer si las dos variables representan al mismo objeto en memoria o si los valores de uno o más de sus campos son equivalentes.Object es la clase base implícita para todos los tipos de valor y de referencia. debe considerar si los objetos son instancias de tipos de valor (structs) o tipos de referencia (clases. Si desea comparar valores. Common Language Runtime reclama automáticamente (mediante la recolección de elementos no utilizados) la memoria asignada a una instancia de clase cuando todas las referencias al objeto han quedado fuera del ámbito."). . // Output: p2 and p1 have the same values.Age = 75. Dado que todas los structs heredan implícitamente de System. Person p2.WriteLine("p2 and p1 have the same values. Para obtener más información sobre la recolección de elementos no utilizados en .ValueType. p2. delegados.Equals(p1)) Console. utilice el método ValueType. (System.Equals. Por el contrario. if (p2.) Para determinar si los campos de instancia de dos instancias de struct tienen los mismos valores. 75).*/ La memoria para p1 y p2 se asigna en la pila de subprocesos.  Para determinar si dos instancias de clase hacen referencia a la misma ubicación en memoria (lo que significa que tienen la misma identidad). No es posible destruir de manera determinista un objeto de clase como se hace en C++. vea recolección de elementos no utilizados.Name = "Wallace". se llama al método directamente en el objeto como se muestra en el ejemplo siguiente:  C# Person p1 = new Person("Wallace". Ésta es una razón por la que los structs se copian en la asignación. matrices). utilice el método estáticoEquals. p2. Identidad de objetos frente aIgualdad de valores Al comparar dos objetos para comprobar si son iguales. Esta memoria se reclama junto con el tipo o método en el que se declara.NET Framework. incluyendo las clases y structs definidos por el usuario. Nota La asignación y desasignación de memoria en el montón administrado están muy optimizadas en Common La no existe una diferencia significativa de costo de rendimiento entre asignar una instancia de clase en el montón pila.

Equals(Object).La implementación System. la clase almacena el tiempo en segundos. Ambas interfaces proporcionan métodos que se pueden utilizar para probar si sus valores son iguales. pero una propiedad denominada Hours permite a un cliente especificar el tiempo en horas. Internamente. La clase también puede implementar las interfaces IEquatable(Of T) o IEqualityComparer(Of T). invalide el método Equals para proporcionar un algoritmo de igualdad eficaz específico de su tipo. Al diseñar sus propias clases que invaliden Equals. } . Al crear sus propios structs. la clase TimePeriod almacena un período de tiempo. En este ejemplo. escribir o calcular el valor de un campo privado. asegúrese de seguir las directrices indicadas en Cómo: Definir la igualdad de valores para un tipo (Guía de programación de C#) y Object.  Para determinar si los valores de los campos de dos instancias de clase son iguales. aunque en realidad son métodos especiales denominados descriptores de acceso. Sin embargo. puede usar el método Equals o el operador ==. Las propiedades pueden utilizarse como si fuesen miembros de datos públicos. a la vez que se promueve la seguridad y flexibilidad de los métodos. //////////////////////////////////////////////////////////////// Propiedades (Guía de programación de C#) Visual Studio 2010 Otras versiones Una propiedad es un miembro que ofrece un mecanismo flexible para leer. Ejemplo C# class TimePeriod { private double seconds. public double Hours { get { return seconds / 3600.ValueType de Equals utiliza la reflexión porque debe ser capaz de determinar qué son los campos en cualquier struct. De este modo. se deben utilizar solo si la clase los ha invalidado o sobrecargado para proporcionar una definición personalizada de lo que significa “igualdad” para los objetos de ese tipo. se puede obtener acceso a los datos con facilidad. Los descriptores de acceso de la propiedad Hours realizan la conversión entre horas y segundos.

ocultando el código de implementación o comprobación.Hours).WriteLine("Time in hours: " + t. El descriptor de acceso de una propiedad get se utiliza para devolver el valor de la propiedad y el descriptor de acceso set se utiliza para asignar un nuevo valor. System. } } } class Program { static void Main() { TimePeriod t = new TimePeriod(). Para obtener más información. t.Hours = 24. vea Propiedades autoimplementadas (Guía de programación de C#).Console. } } // Output: Time in hours: 24 Información general sobre propiedades   Las propiedades permiten que una clase exponga una manera pública de obtener y establecer valores. Estos descriptores de acceso pueden tener niveles de acceso diferentes. La palabra clave value se usa para definir el valor asignado por el descriptor de acceso set. Para obtener más información. vea Restringir la accesibilidad del descriptor de acceso (Guía de programación de C#).set { seconds = value * 3600. // Assigning the Hours property causes the 'set' accessor to be called. considere la posibilidad de utilizar propiedades autoimplementadas. // Evaluating the Hours property causes the 'get' accessor to be called.    ////////////////////////////////////////////////// Interfaces (Guía de programación de C#) Visual Studio 2010 Otras versiones . En el caso de las propiedades simples que no requieren ningún código de descriptor de acceso personalizado. Las propiedades que no implementan un descriptor de acceso set son de solo lectura.

} // Implementation of IEquatable<T> interface public bool Equals(Car car) { if (this. Los miembros de interfaz son automáticamente públicos y no pueden incluir ningún modificador de acceso.Model && this. destructores o tipos. La propia interfaz no proporciona ninguna funcionalidad que una clase o struct pueda heredar de la manera en que se puede heredar la funcionalidad de una clase base. Cuando una clase o struct implementa una interfaz. recibe sólo los nombres de métodos y las firmas. } Las interfaces están compuestas de métodos. Para definir una interfaz. set. ya que la propia interfaz no contiene ninguna implementación. Al igual que las clases heredan una clase base o struct. indizadores o cualquier combinación de estos cuatro tipos de miembros. } public string Year { get. No puede contener miembros estáticos. constructores de instancias. como se muestra en el ejemplo siguiente. como se muestra en el ejemplo siguiente.Las interfaces describen un grupo de funcionalidades relacionadas que pueden pertenecer a cualquier elemento class o struct. set.Make && this. propiedades. C# public class Car : IEquatable<Car> { public string Make {get.Year == car.Make == car. con dos excepciones:   Una clase o struct puede implementar más de una interfaz. C# interface IEquatable<T> { bool Equals(T obj). las clases y structs implementan interfaces. dicha clase o struct proporciona una implementación para todos los miembros que define la interfaz. operadores.} public string Model { get. la clase derivada hereda esta implementación. Una interfaz no puede contener constantes. Cuando una clase o struct implementan una interfaz. set. utilice la palabra claveinterface. Se dice que la clase derivada implementa la interfaz de forma implícita.Year) . si una clase base implementa una interfaz.Model == car. campos. eventos. Sin embargo.

como en class ClassName : InterfaceName. una interfaz puede declarar una propiedad que tiene un descriptor de acceso get. } else return false. no estático y tener el mismo nombre y la misma firma que el miembro de interfaz. indizadores y propiedades. Para obtener más información. una clase derivada puede cambiar el comportamiento de la interfaz al invalidar los miembros virtuales. métodos. el miembro correspondiente de la clase debe ser público. dicha clase base proporcionará su implementación. el usuario de la interfaz no necesita saber cómo se implementa. a través de las clases base que hereda o de interfaces heredadas por otras interfaces.{ return true. Sin embargo. la clase puede implementar una interfaz solo una vez y solo si la interfaz se declara como parte de la definición de clase. Sin embargo. Información general sobre interfaces Una interfaz tiene las siguientes propiedades:    Una interfaz es como una clase base abstracta: cualquier tipo no abstracto que implementa la interfaz debe implementar todos sus miembros. Es posible que una clase herede una interfaz varias veces. Las interfaces pueden heredar otras interfaces. La clase que implementa la interfaz puede declarar la misma propiedad con los descriptores de acceso get y set. . vea Propiedades de interfaces (Guía de programación de C#). En ese caso. No se pueden crear instancias directamente de una interfaz. los descriptores de acceso deben coincidir. Si la interfaz se hereda porque se heredó una clase base que implementa esta interfaz. Las interfaces pueden contener eventos. Por ejemplo. Para implementar un miembro de interfaz. vea Clases y miembros de clase abstractos y sellados (Guía de programación de C#). Las interfaces y los miembros de interfaz son abstractos. si la propiedad o el indizador utiliza una implementación explícita. vea Polimorfismo (Guía de programación de C#). Para obtener más información sobre miembros virtuales. } } La interfaz IEquatable(Of T) informa al usuario del objeto de que éste puede determinar si es igual que otros objetos del mismo tipo. las interfaces no proporcionan una implementación predeterminada. Las propiedades e indizadores de una clase pueden definir descriptores de acceso adicionales para una propiedad o indizador definidos en una interfaz. También es posible que una clase base implemente miembros de interfaz a través de miembros virtuales. Para obtener más información sobre la implementación explícita.

Una interfaz se puede heredar de varias interfaces. ////////////////////////////////////////////// . Las clases y structs pueden implementar más de una interfaz.   Las interfaces no contienen implementaciones de métodos.

_W`»_WU[ZV_bSaW ¼ ¼ ¼   US__ ^[Y^S » _`S`Ub[V SZ´ » W W^[V`ZWcW W^[V´  ¯¯__YZZY`W [a^_\^[\W^` USa_W_`Wú_W`úSUUW__[^`[TWUSWV ` [a^_   ¯¯bSaS`ZY`W [a^_\^[\W^` USa_W_`WúYW`úSUUW__[^`[TWUSWV  _`W[Z_[W^`W ZWûWZ[a^_û` [a^_´ ¼ ¼ ¯¯.

.0../086:0342502039../08825086:034706:0703333.2..57450/.#089737..//0/08./0./4 .:3./05747.O3  .7.0784308 ..7594708/0 .857450/.7./05747.7:33:0.84-7057450/....57450/..:9.$9:/4   97...8....2..0845:0/03903073..4..0.008/0.84/0.07.7.:942502039./..08 :J..47/0..307.O3  /08.084809  .3/40.a`\a`WZ[a^_    31472./ 0/08...  30.../0850729036:0:3.7..-0.084/0:3.5.!7450/.O3 .O3/0  O O O $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 39071.O30307.8 :J./05747.O34./0980:9.548-/.438/070.8 !..75947/0..O/4/02502039.83.800543.../..5.857450/.9:7.757450/.084/10703908 !.0.5.7....75947/0./08..O/4/0/08.75947/0.4-903072E831472.5..75947/0.:080:8.83.4708 4.O3/0  .2.//0:9../45470/08.75947/0.3:3/08...:942502039.5-.857450/.75947/0 .4.4-903072E831472./08 ./04-90307 089..070.2.42574-.084507843.08480980:9.084 :J..47 8948/08..084809843/08440.-7.47.O3/0  '8:../01370.08-/./08  O O .

 25J.8 /0897:..9749548/0202-748 &3.3:3.9 ...92502039.808897:../47084.3908  .....036:0805:0/0070/..7..030002548:0390    Z`W^XSUW ]aS`STW » T[[]aS_[T´ ¼   .39071.3.:942E9..3/4:3. .2. 030002548:0390    \aTUUS__S^ ]aS`STWS^ » \aTU_`^ZY SW»YW`_W`¼ \aTU_`^ZY [VW»YW`_W`¼ \aTU_`^ZYWS^»YW`_W`¼  ¯¯ \WWZ`S`[Z[X ]aS`STWZ`W^XSUW \aTUT[[]aS_S^US^´ » X`_ SWUS^ SW  `_ [VWUS^ [VW  `_WS^US^WS^´ . /.4389.39071.9 !..39071.39071..03948 3/./6:0:3. .43.48345:0/033..425:089././0137:3.804897:.74 8:3././01472.808070/.80 $302-.  :.4308 O O &3.3/4:3. :9.7 .39071.39071.-08O448342-708/02F94/48 .43.4390307 202-748089E9.O3/008948.80-.4390307.43903033:3.839071.039071.:3.80 /07..43.7/0.80/07...6:07 .80-.5.80-.95:0/.//0:3../4708 .92502039.95:0/02502039.5745.07.982502039.804897:..802502039..8172.1:3.39071..6:070020394..43.34..8 ...9..O3 ./0870.48 48202-748/039071.5745.72E8/0:3.05.203905-.339071.804897:.08/08.94708/0389.:7 33324/1.070/.0.....:.7.345:0/0.08  .7-03:37:54/01:3..8..86:05:0/035079030.2502039.-7....06:0.94/4848202-7486:0/0130.884897:.43.084  :./08 0.839071.307.:.424802:0897..O3 $0/.804897:..  :.8. 2502039./.39071..1:3./.43897:.9574547.42-3.843..2548 4507.070/.39071. .2502039.39071.6:0..O35.:3.3:3...9470849548 45:0/0.804897:.43./47/0.804897:./.089.2502039.6:0.:3.. 70.8/02F94/48 57450/.43/480.08089E3... 33:3./.:.34574547.0 ...42480 2:0897.

...  !. .3./0-02502039./.0834574547.8547497.74 . 39071.8.806:0070/.. 2502039.74/0.805:0/03/0137/08.839071...79:.....7594708/0. 57450/.08 $3 02-.4-903072E831472.5:0/0/0.808-.424:3..-897./7 !.3..../4708/0:3.39071.5:0/0/0.O30307.80 ..6:..6:0795434./0 5747.7.80-..39071.172.-897..7. 0202-74.7E8: 2502039.20394/0.748202-748.946:02502039..!42471824 :J./.7. 39071.39071.97.282./47/013/4803:3.2.80/0.57450/.20390/0:3.9030.08.2-F308548-06:0:3.08409809 $302-.843./05747. !4700254 :3.39071.9....49030702824342-70..7808:.......2.39071.08 ..5:0/0.O305J. 48/08.-0 1% 31472.806:02502039..O3 %.9.4/039071.08 3080.O384-70...2-.839071.80-.790/0....  .43.47708543/0390/0..7.425479.-897.:3.08  &3.839071.0./08  .7:3202-74/039071.80574547.../05747.7389.75947/0.2502039.88:0390857450/.39071..39071..7.839071..08  ..O3/0  31472.4-903072E831472...O305J.70.O3570/090723. /.4-903072E8 31472.3430.8025020390202-748/039071..7.08 !.08448.8..80070/./08/039071.43903070.857450/..94880.88.839071.84 :3./.O3/0  .948..805:0/02502039.-897.4  34089E9.O24802502039.-07.88./013./470857450/.9.08 8548-06:0:3.089.03948 2F94/48 3/.. !.808202-748/0.7594708/0.0./6:0 9030:3/08.0.08070/.43. .39071.839071.7:3.7.43.. 6:0497484-0948/028249540:8:..F8/0.20 $.84-7039071...:3.80/0-08075-.O3 .7497..:.74/04-094/06:0F8905:0/0/090723..80/07...» ^W`a^Z`^aW ¼ W_W ^W`a^ZXS_W ¼ ¼   ..42403.79:.39071.97..39071.794/488:8202-748  4805:0/03.9./.2..79:.39071.O3/0  ..2502039.085.8/70..7:3.282.2039071.57450/.085:0/03.74 8.O3/0.0.0.57450/./08 O O O &3./4 3/..08409 ..2502039..80070/0:3..9..084/0-03.F8 /0202-748.!7450/.4348/08./.6:00202-74/039071.3:3.39071.80-.7.80./403/.0848202-748/039071.7..80 .806:02502039.7594708/0.084.08 :J./.43.7..8 .085:0/03070/.844:3./48 :J.:8:./08 03/.....70..80-./47 :9...424 5.089.O384-70202-748.39071. 5476:080070/O:3...

.O O O  .43903032502039.839071.805:0/0070/.7/0.7.8.985:0/032502039.4308/02F94/48  .0834...839071.39071.  &3..08  .808897:.72E8/0:3.39071..

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

 .

Sign up to vote on this title
UsefulNot useful