mtodo "StartEngine" de las clases derivadas de la misma forma, con independencia del tipo de objeto "Car" que se est utilizando en ese momento. Sobrecarga, reemplazo y sombreado La sobrecarga, el reemplazo y el sombreado son conceptos similares que pueden confundirse fcilmente. Aunque las tres tcnicas permiten crear miembros con el mismo nombre, existen algunas diferencias importantes.
Los miembros sobrecargados se utilizan para proporcionar diferentes versiones de una propiedad o mtodo que tienen el mismo nombre, pero que aceptan un nmero diferente de parmetros, o parmetros con diferentes tipos de datos.
Las propiedades y mtodos reemplazados se utilizan para reemplazar una propiedad o mtodo heredados que no son apropiados en una clase derivada. Los miembros reemplazados deben aceptar el mismo tipo de datos y nmero de argumentos. Las clases derivadas heredan los miembros reemplazados.
Los miembros sombreados se utilizan para reemplazar localmente un miembro que tiene un mbito ms amplio. Cualquier tipo puede sombrear cualquier otro tipo. Por ejemplo, puede declarar un propiedad que sombree un mtodo heredado con el mismo nombre. Los miembros sombreados no se pueden heredar.
Objetos y clases
Un objeto es una combinacin de cdigo y datos que puede tratarse como una unidad. Un objeto puede ser una porcin de una aplicacin, como un control o un formulario. Una aplicacin entera tambin puede ser un objeto. Reutilizar el cdigo Los objetos permiten declarar variables y procedimientos una vez y utilizarlos siempre que sean necesarios. Por ejemplo, si desea agregar un corrector ortogrfico a una aplicacin, puede definir todas las variables y funciones auxiliares para proporcionar funcionalidad de correccin ortogrfica. Si crea el corrector ortogrfico como una clase, puede volver a utilizarlo en otras aplicaciones mediante la inclusin de una referencia en el ensamblado compilado. An mejor, tal vez pueda ahorrarse trabajo mediante el uso de una clase de corrector ortogrfico que otra persona ya haya desarrollado. Clases Cada objeto de Visual Basic est definido por una clase. Una clase describe las variables, propiedades, procedimientos y eventos de un objeto. Los objetos son instancias de clases; pueden crearse tantos objetos como sean necesarios una vez que se defina una clase. Para comprender la relacin entre un objeto y su clase, piense en los moldes de hacer galletas y en las galletas. El molde es la clase. Define las caractersticas de cada galleta, por ejemplo, el tamao y la forma. La clase se utiliza para crear objetos. Los objetos son las galletas. Dos ejemplos en Visual Basic podran ayudar a ilustrar la relacin entre las clases y objetos.
Los controles en el Cuadro de herramientas de Visual Basic representan las clases. Cuando se arrastra un control del Cuadro de herramientas a un formulario, se est creando un objeto; una instancia de una clase.
El formulario con el que se trabaja en tiempo de diseo es una clase. En tiempo de ejecucin, Visual Basic crea una instancia de la clase del formulario, es decir, un objeto.
Varias instancias Los objetos recientemente creados a partir de una clase son a menudo idnticos. Una vez que existen como objetos individuales no obstante, sus variables y propiedades se pueden cambiar independientemente de las dems instancias. Por ejemplo, si agrega tres casillas de verificacin a un formulario, cada objeto de botn de casilla de verificacin es una instancia de la clase CheckBox [ http://msdn.microsoft.com/es-mx/library/system.windows.forms.checkbox(printer).aspx ] . Los objetos CheckBox [ http://msdn.microsoft.com/esmx/library/system.windows.forms.checkbox(printer).aspx ] individuales comparten un conjunto de caractersticas y funciones comunes (propiedades, variables, procedimientos y eventos) definidos por la clase. No obstante, cada uno tiene su propio nombre, puede habilitarse y deshabilitarse por separado, y puede colocarse en una ubicacin diferente en el formulario. Gua de programacin de Visual Basic
nextCustomer.accountNumber = lastAccountNumber + 1
Programacin eficaz Siempre que sea posible, debe declarar la variable para que sea del tipo de clase que piensa asignarle. Esto se llama enlace en tiempo de compilacin. Si no conoce el tipo de clase en el tiempo de compilacin, puede invocar el enlace en tiempo de ejecucin declarando la variable para que sea Object (Tipo de datos) [ http://msdn.microsoft.com/es-mx/library/twcxd6b8(printer).aspx ] . Sin embargo, el enlace en tiempo de ejecucin puede ralentizar el rendimiento y limitar el acceso a los miembros del objeto en tiempo de ejecucin. Para obtener ms informacin, consulte Declaracin de variables de objeto [ http://msdn.microsoft.com/es-mx/library/cfwx51t1(printer).aspx ] .
es/library/system.componentmodel.component(printer).aspx ] que se hereda para definir los componentes y Exception [ http://msdn.microsoft.com/es-es/library/system.exception(printer).aspx ] que se hereda para definir las clases de excepcin personalizadas. .NET Framework es ms que un origen para las clases base; garantiza la compatibilidad entre clases creadas con lenguajes de programacin diferentes. las clases de Visual Basic pueden heredar de las clases en ensamblados creados por cualquier lenguaje admitido por Visual Studio. Las clases que crea en Visual Basic tambin se pueden utilizar como clases base por otros lenguajes de programacin de .NET Framework. Gua de programacin de Visual Basic
Se puede volver a utilizar cdigo de las clases base. Es necesario aplicar la misma clase y los mismos mtodos a tipos de datos diferentes. La jerarqua de clases es poco profunda y es poco probable que otros programadores agreguen muchos ms niveles.
Desea realizar cambios globales en clases derivadas modificando una clase base.
Estas consideraciones se explican en este orden a continuacin. Herencia y relaciones de identidad Dos maneras de mostrar las relaciones de clase en la programacin orientada a objetos son las relaciones de identidad y de pertenencia. En una relacin de identidad, la clase derivada es claramente un tipo de clase base. Por ejemplo, una clase denominada PremierCustomer representa una relacin de tipo identidad con una clase base denominada Customer, puesto que un cliente principal es un cliente. No obstante, una clase denominada CustomerReferral representa una relacin de pertenencia con la clase Customer porque una cartera de clientes tiene un cliente, pero no es un tipo de cliente. Los objetos de una jerarqua de herencia deben tener una relacin de identidad con la clase base puesto que heredan los campos, propiedades, mtodos y eventos definidos en dicha clase. Las clases que representan una relacin de pertenencia con otras clases no son vlidas para jerarquas de herencia debido a que podran heredar propiedades y mtodos inadecuados. Por ejemplo, si la clase CustomerReferral se derivase de la clase Customer descrita anteriormente, podra heredar propiedades que no tendran sentido, como ShippingPrefs y LastOrderPlaced. Las relaciones de pertenencia como sta deben representarse mediante clases o interfaces no relacionadas. La siguiente ilustracin muestra ejemplos de relaciones de tipo "es un" y "tiene un".
Clases base y reutilizacin de cdigo Otra razn para usar la herencia es la ventaja de poder reutilizar el cdigo. Las clases bien diseadas, una vez depuradas, pueden utilizarse una y otra vez como base de nuevas clases. Un ejemplo comn de reutilizacin eficaz de cdigo est relacionado con bibliotecas que administran estructuras de datos. Por ejemplo, suponga que tiene una gran aplicacin comercial que administra varias clases de listas en la memoria. Una es una copia en memoria de la base de datos de clientes, que se lee desde una base de datos al iniciar la sesin para conseguir mayor velocidad. La estructura de datos tendra un aspecto similar al siguiente: Visual Basic Copiar cdigo
Class CustomerInfo Protected PreviousCustomer As CustomerInfo Protected NextCustomer As CustomerInfo Public ID As Integer Public FullName As String
Public Sub InsertCustomer(ByVal FullName As String) ' Insert code to add a CustomerInfo item to the list. End Sub
Public Sub DeleteCustomer() ' Insert code to remove a CustomerInfo item from the list. End Sub
Public Function GetNextCustomer() As CustomerInfo ' Insert code to get the next CustomerInfo item from the list. Return NextCustomer End Function
Public Function GetPrevCustomer() As CustomerInfo 'Insert code to get the previous CustomerInfo item from the list. Return PreviousCustomer End Function End Class
La aplicacin tambin podra tener una lista similar de productos que el usuario ha agregado a una lista del carro de la compra, como se muestra en el siguiente fragmento de cdigo: Visual Basic Copiar cdigo
Class ShoppingCartItem Protected PreviousItem As ShoppingCartItem Protected NextItem As ShoppingCartItem Public ProductCode As Integer Public Function GetNextItem() As ShoppingCartItem ' Insert code to get the next ShoppingCartItem from the list. Return NextItem End Function End Class
Aqu puede ver un modelo: dos listas se comportan del mismo modo (inserciones, eliminaciones y recuperaciones) pero funcionan con tipos de datos diferentes. Mantener dos bases de cdigo para realizar esencialmente las mismas funciones no es eficaz. La solucin ms eficaz consiste en separar la administracin de listas en su propia clase y despus heredar de esa clase para diferentes tipos de datos: Visual Basic Copiar cdigo
Class ListItem Protected PreviousItem As ListItem Protected NextItem As ListItem Public Function GetNextItem() As ListItem ' Insert code to get the next item in the list. Return NextItem End Function Public Sub InsertNextItem() ' Insert code to add a item to the list. End Sub
Public Sub DeleteNextItem() ' Insert code to remove a item from the list. End Sub
Public Function GetPrevItem() As ListItem 'Insert code to get the previous item from the list. Return PreviousItem End Function End Class
La clase ListItem slo tiene que ser depurada una vez. Despus podr generar clases que la utilicen sin tener que pensar nunca ms sobre la administracin de listas. Por ejemplo: Visual Basic Copiar cdigo
Class CustomerInfo Inherits ListItem Public ID As Integer Public FullName As String End Class Class ShoppingCartItem Inherits ListItem Public ProductCode As Integer End Class
Aunque la reutilizacin de cdigo basado en la herencia es una herramienta eficaz, tambin tiene riesgos asociados. Incluso los sistemas mejor diseados cambian a veces de tal modo que los diseadores no podran prever. A veces, los cambios en una jerarqua de clases existente pueden tener consecuencias no deseadas; en la seccin Cambios en el diseo de la clase base despus de la implementacin [ http://msdn.microsoft.com/es-es/library/s57zewcx(printer).aspx ] de "El problema de fragilidad de la clase base" se describen algunos ejemplos. Clases derivadas intercambiables Las clases derivadas de una jerarqua de clases pueden a veces intercambiarse con la clase base, un proceso denominado polimorfismo basado en la herencia. Este enfoque combina las mejores caractersticas del polimorfismo basado en la interfaz con la opcin de reutilizar o reemplazar cdigo de una clase base. As, esto podra ser til en un paquete de dibujo. Por ejemplo, considere el siguiente fragmento de cdigo, que no utiliza herencia: Visual Basic Copiar cdigo
Sub Draw(ByVal Shape As DrawingShape, ByVal X As Integer, _ ByVal Y As Integer, ByVal Size As Integer)
Select Case Shape.type Case shpCircle ' Insert circle drawing code here. Case shpLine ' Insert line drawing code here.
Este enfoque presenta algunos problemas. Si alguien decide agregar una opcin de elipse posteriormente, ser necesario modificar el cdigo fuente; puede ocurrir que los usuarios a los que va dirigido ni siquiera tengan acceso al cdigo fuente. Un problema ms sutil consiste en que para dibujar una elipse se necesita otro parmetro (las elipses tienen un dimetro principal y uno secundario) que no sera relevante para el caso de la lnea. Si alguien desea agregar una polilnea (mltiples lneas conectadas), entonces se agregara otro parmetro que no sera relevante para otros casos. La herencia resuelve la mayora de estos problemas. Las clases base bien diseadas dejan la implementacin de mtodos especficos para las clases derivadas, de modo que se pueda incluir cualquier forma. Otros programadores pueden implementar mtodos en clases derivadas con la documentacin de la clase base. Otros elementos de clase (como las coordenadas x e y) se pueden integrar en la clase base porque todas las descendientes los utilizan. Por ejemplo, Draw podra ser un mtodo MustOverride: Visual Basic Copiar cdigo
MustInherit Class Shape Public X As Integer Public Y As Integer MustOverride Sub Draw() End Class
Despus podra agregar los elementos necesarios a esa clase para las diferentes formas. Por ejemplo, una clase Line podra necesitar nicamente un campo Length: Visual Basic Copiar cdigo
Class Line Inherits Shape Public Length As Integer Overrides Sub Draw() ' Insert code here to implement Draw for this shape. End Sub End Class
Este planteamiento es til debido a que otros programadores que no tienen acceso al cdigo fuente pueden extender la clase base con nuevas clases derivadas segn sea necesario. Por ejemplo, una clase denominada Rectangle podra derivarse de la clase Line: Visual Basic Copiar cdigo
Class Rectangle Inherits Line Public Width As Integer Overrides Sub Draw() ' Insert code here to implement Draw for the Rectangle shape.
En este ejemplo se muestra cmo se puede pasar de clases de propsito general a clases muy especficas mediante la implementacin de detalles en cada nivel. En este punto podra ser conveniente volver a evaluar si la clase derivada realmente representa una relacin de identidad o, por el contrario, es una relacin de pertenencia. Si la nueva clase de rectngulo se compone solamente de lneas, entonces la herencia no es la mejor opcin. No obstante, si el nuevo rectngulo es una lnea con una propiedad de ancho, entonces se mantiene la relacin de identidad. Jerarquas de clases poco profundas La herencia se adapta mejor a jerarquas de clases relativamente poco profundas. Las jerarquas de clases complejas y profundas en exceso pueden ser difciles de desarrollar. La decisin de utilizar una jerarqua de clases implica sopesar sus ventajas y su complejidad. Como norma general, las jerarquas deberan limitarse a seis niveles o menos. No obstante, la profundidad mxima de una jerarqua de clases concreta depende de varios factores, incluida la complejidad de cada nivel. Cambios globales en clases derivadas a travs de la clase base Una de las caractersticas ms eficaces de la herencia es la posibilidad de realizar cambios en una clase base que se propagan a las clases derivadas. Si se usa con cuidado, puede actualizarse la implementacin de un solo mtodo y decenas, e incluso cientos, de clases derivadas podrn utilizar el nuevo cdigo. No obstante, esta prctica puede resultar peligrosa puesto que tales cambios podran generar problemas en clases heredadas diseadas por otras personas. Debe tenerse cuidado para asegurarnos de que la nueva clase es compatible con las clases que utilizan la original. Concretamente, debe evitarse cambiar el nombre o el tipo de los miembros de la clase base. Suponga, por ejemplo, que disea una clase base con un campo de tipo Integer para almacenar la informacin de cdigo postal, y que otros programadores han creado clases derivadas que utilizan el campo de cdigo postal heredado. Suponga adems que el campo de cdigo postal almacena cinco dgitos y que la oficina de correos ha ampliado los cdigos postales con un guin y cuatro dgitos adicionales. En el peor de los casos, podra modificar el campo en la clase base para almacenar una cadena de diez caracteres, pero otros programadores tendran que cambiar y volver a compilar las clases derivadas para utilizar el tamao y el tipo de datos nuevos. La forma ms segura de cambiar una clase base es simplemente agregar nuevos miembros. Por ejemplo, podra agregar un nuevo campo para almacenar cuadro dgitos ms en el ejemplo de cdigo postal descrito anteriormente. De esta forma, las aplicaciones cliente pueden actualizarse para que utilicen el nuevo campo sin interrumpir las aplicaciones existentes. Esta posibilidad de extender clases base en una jerarqua de herencia es una ventaja importante que no existe con interfaces. Gua de programacin de Visual Basic
Polimorfismo
El polimorfismo se refiere a la posibilidad de definir mltiples clases con funcionalidad diferente, pero con mtodos o propiedades denominados de forma idntica, que pueden utilizarse de manera intercambiable mediante cdigo cliente en tiempo de ejecucin. En esta seccin Cmo proporciona Visual Basic polimorfismo [ http://msdn.microsoft.com/eses/library/28t6afce(printer).aspx ] Se ilustran distintos enfoques del polimorfismo. Polimorfismo basado en la herencia [ http://msdn.microsoft.com/es-es/library/akfttx8c(printer).aspx ] Se describe el uso de la herencia para conseguir el polimorfismo. Polimorfismo basado en la interfaz [ http://msdn.microsoft.com/es-es/library/z9k8e08x(printer).aspx ]
Se describe el uso de las interfaces para conseguir el polimorfismo. Secciones relacionadas Cundo se deben utilizar interfaces [ http://msdn.microsoft.com/es-es/library/3b5b8ezk(printer).aspx ] Explica cundo se deben utilizar interfaces en lugar de una jerarqua de herencia. Cundo utilizar la herencia [ http://msdn.microsoft.com/es-es/library/27db6csx(printer).aspx ] Proporciona informacin sobre cundo se debe utilizar la herencia en lugar de interfaces. Gua de programacin de Visual Basic
' %5.3 State tax Const StateRate As Double = 0.053 ' %2.8 City tax Const CityRate As Double = 0.028 Public Class BaseTax Overridable Function CalculateTax(ByVal Amount As Double) As Double ' Calculate state tax. Return Amount * StateRate End Function End Class
Public Class CityTax ' This method calls a method in the base class ' and modifies the returned value.
Inherits BaseTax Private BaseAmount As Double Overrides Function CalculateTax(ByVal Amount As Double) As Double ' Some cities apply a tax to the total cost of purchases, ' including other taxes. BaseAmount = MyBase.CalculateTax(Amount) Return CityRate * (BaseAmount + Amount) + BaseAmount End Function End Class
Sub TestPoly() Dim Item1 As New BaseTax Dim Item2 As New CityTax ' $22.74 normal purchase. ShowTax(Item1, 22.74) ' $22.74 city purchase. ShowTax(Item2, 22.74) End Sub
Sub ShowTax(ByVal Item As BaseTax, ByVal SaleAmount As Double) ' Item is declared as BaseTax, but you can ' pass an item of type CityTax instead. Dim TaxAmount As Double TaxAmount = Item.CalculateTax(SaleAmount) MsgBox("The tax is: " & Format(TaxAmount, "C")) End Sub
En este ejemplo, el procedimiento ShowTax acepta un parmetro denominado Item de tipo BaseTax, pero tambin puede pasar cualquiera de las clases derivadas de la clase BaseTax, como CityTax. La ventaja de este diseo es que se pueden agregar nuevas clases derivadas de la clase BaseTax sin cambiar el cdigo cliente en el procedimiento ShowTax. Gua de programacin de Visual Basic
El siguiente ejemplo define una interfaz denominada Shape2 que se implementa en una clase denominada RightTriangleClass2 y RectangleClass2. Un mtodo denominado ProcessShape2 llama al mtodo de instancias CalculateArea de RightTriangleClass2 o RectangleClass2: Visual Basic Copiar cdigo
Sub TestInterface() Dim RectangleObject2 As New RectangleClass2 Dim RightTriangleObject2 As New RightTriangleClass2 ProcessShape2(RightTriangleObject2, 3, 14) ProcessShape2(RectangleObject2, 3, 5) End Sub
Sub ProcessShape2(ByVal Shape2 As Shape2, ByVal X As Double, _ ByVal Y As Double) MsgBox("The area of the object is " _ & Shape2.CalculateArea(X, Y)) End Sub
Public Interface Shape2 Function CalculateArea(ByVal X As Double, ByVal Y As Double) As Double End Interface
Public Class RightTriangleClass2 Implements Shape2 Function CalculateArea(ByVal X As Double, _ ByVal Y As Double) As Double Implements Shape2.CalculateArea ' Calculate the area of a right triangle. Return 0.5 * (X * Y) End Function End Class
Public Class RectangleClass2 Implements Shape2 Function CalculateArea(ByVal X As Double, _ ByVal Y As Double) As Double Implements Shape2.CalculateArea ' Calculate the area of a rectangle. Return X * Y End Function End Class
Gua de programacin de C#
clase [ http://msdn.microsoft.com/esestructura [ http://msdn.microsoft.com/eses/library/ah19swz4(printer).aspx ] , interfaz [ http://msdn.microsoft.com/eses/library/87d83y5b(printer).aspx ] o mtodo en dos o ms archivos de cdigo fuente. Cada archivo de cdigo fuente contiene una seccin de la definicin de tipos o mtodos, y todas las partes se combinan cuando se compila la aplicacin. Clases parciales Existen diversas situaciones en las que es conveniente dividir una definicin de clase:
Al trabajar en proyectos grandes, el hecho de dividir una clase en archivos independientes permite que varios programadores trabajen al mismo tiempo con ella.
Al trabajar con un cdigo fuente generado automticamente, se puede agregar el cdigo a la clase sin tener que volver a crear el archivo de cdigo fuente. Visual Studio utiliza este enfoque al crear formularios Windows Forms, cdigo contenedor de un servicio web, etc. Se puede crear cdigo que utilice estas clases sin tener que modificar el archivo creado por Visual Studio.
partial [ http://msdn.microsoft.com/es-
Copiar cdigo
public partial class Employee { public void DoWork() { } }
La palabra clave partial indica que otras partes de la clase, estructura o interfaz se pueden definir en el espacio de nombres. Todas las partes deben utilizar la palabra clave partial. Todas las partes deben
estar disponibles en tiempo de compilacin para formar el tipo final. Todas las partes deben tener la misma accesibilidad, ya sea public, private, etc. Si alguna parte se declara abstracta, todo el tipo se considera abstracto. Si alguna parte se declara sealed, todo el tipo se considera sealed. Si alguna parte declara un tipo base, todo el tipo hereda esa clase. Todas las partes que especifican una clase base deben concordar, pero las partes que omiten una clase base heredan igualmente el tipo base. Las partes pueden especificar diferentes interfaces base, pero el tipo final implementa todas las interfaces mostradas por todas las declaraciones parciales. Cualquier miembro de clase, estructura o interfaz declarado en una definicin parcial est disponible para todas las dems partes. El tipo final es la combinacin de todas las partes en tiempo de compilacin. Nota: El modificador partial no est disponible en declaraciones de delegado o enumeracin.
El siguiente ejemplo muestra que los tipos anidados pueden ser parciales, aunque el tipo en el que estn anidados no sea propiamente parcial. C#
Copiar cdigo
class Container { partial class Nested { void Test() { } } partial class Nested { void Test2() { } } }
En tiempo de compilacin, se combinan los atributos de definiciones de tipo parcial. Por ejemplo, consideremos las siguientes declaraciones: C#
Copiar cdigo
[System.SerializableAttribute] partial class Moon { }
[System.ObsoleteAttribute]
Copiar cdigo
[System.SerializableAttribute] [System.ObsoleteAttribute] class Moon { }
Los siguientes elementos se combinan a partir de todas las definiciones de tipo parcial:
comentarios XML interfaces atributos de parmetro de tipo genrico atributos de clase miembros
Copiar cdigo
partial class Earth : Planet, IRotate { } partial class Earth : IRevolve { }
Copiar cdigo
class Earth : Planet, IRotate, IRevolve { }
Restricciones Existen varias reglas que se deben seguir al trabajar con definiciones de clase parciales:
Todas las definiciones de tipo parcial creadas para ser parte del mismo tipo deben modificarse con partial. Por ejemplo, las siguientes declaraciones de clase generan un error: C#
Copiar cdigo
public partial class A { } //public class A { } // Error, must also be marked partial
El modificador partial slo puede aparecer inmediatamente antes de las palabras clave class, struct o interface.
Se permiten tipos parciales anidados en definiciones de tipo parcial, como se muestra en el siguiente ejemplo: C#
Copiar cdigo
partial class ClassWithNestedClass { partial class NestedClass { } }
Todas las definiciones de tipo parcial que deben ser parte del mismo tipo deben definirse en el mismo ensamblado y el mismo mdulo (archivo .exe o .dll). Las definiciones parciales no pueden abarcar varios mdulos.
Los parmetros de nombre de clase y tipo genrico deben coincidir en todas las definiciones de tipo parcial. Los tipos genricos pueden ser parciales. Todas las declaraciones parciales deben utilizar los mismos nombres de parmetro en el mismo orden.
Las siguientes palabras clave en una definicin de tipo parcial son opcionales, pero si hay alguna en una definicin de tipo parcial, no puede entrar en conflicto con las palabras clave especificadas en otra definicin parcial para el mismo tipo:
Copiar cdigo
public partial class CoOrds { private int x; private int y;
class TestCoOrds { static void Main() { CoOrds myCoOrds = new CoOrds(10, 15); myCoOrds.PrintCoOrds(); } }
Resultado CoOrds: 10,15 Ejemplo 2 Description El siguiente ejemplo muestra que tambin se pueden desarrollar estructuras e interfaces parciales. Cdigo C#
Copiar cdigo
partial interface ITest { void Interface_Test(); }
partial struct S1 {
void Struct_Test() { } }
Mtodos parciales Una clase o estructura parcial puede contener un mtodo parcial. Una parte de la clase contiene la firma del mtodo. Una implementacin opcional se puede definir en la misma parte u otra parte. Si no se proporciona la implementacin, el mtodo y todas las llamadas a l se eliminan en tiempo de compilacin. Los mtodos parciales permiten al implementador de una parte de una clase definir un mtodo, de forma similar a un evento. El implementador de la otra parte de la clase puede decidir si implementar el mtodo o no. Si no se implementa el mtodo, el compilador quita la firma del mtodo y todas las llamadas al mtodo. Por consiguiente, cualquier cdigo en la clase parcial puede utilizar libremente un mtodo parcial, aun cuando no se proporcione la implementacin. No se producir ningn error en tiempo de compilacin o en tiempo de ejecucin si se realizan llamadas al mtodo y ste no est implementado. Los mtodos parciales son especialmente tiles como una manera de personalizar el cdigo generado. Permiten reservar un nombre y una firma de mtodo, de modo que el cdigo generado pueda llamar al mtodo y el programador pueda decidir si lo implementa o no. De forma muy similar a las clases parciales, los mtodos parciales permiten que el cdigo creado por un generador de cdigo y el cdigo creado por un programador humano puedan funcionar juntos sin costes en tiempo de ejecucin. Una declaracin de mtodo parcial consta de dos partes: la definicin y la implementacin. stas pueden estar en partes independientes de una clase parcial o en la misma parte. Si no existe ninguna declaracin de implementacin, el compilador quita la declaracin de definicin y todas las llamadas al mtodo.
Copiar cdigo
// Definition in file1.cs partial void onNameChanged();
Las declaraciones de mtodo parciales deben comenzar con la palabra clave contextual
partial [
void [ http://msdn.microsoft.com/es-es/library/yah0tteb(printer).aspx ] .
ref [ http://msdn.microsoft.com/es-
out [ http://msdn.microsoft.com/es-
private [ http://msdn.microsoft.com/esvirtual [
extern [ http://msdn.microsoft.com/es-
static [ http://msdn.microsoft.com/es-
unsafe [ http://msdn.microsoft.com/es-
Los mtodos parciales pueden ser genricos. Las restricciones se colocan en la declaracin de mtodo parcial que realiza la definicin, y se pueden repetir opcionalmente en la parte de implementacin. Los nombres de parmetros y parmetros de tipo no tienen que ser iguales en la declaracin que realiza la implementacin y en la que realiza la definicin.
No se puede crear un
delegado [ http://msdn.microsoft.com/es-
es/library/900fyy8e(printer).aspx ] para un mtodo parcial. Especificacin del lenguaje C# Para obtener ms informacin, vea las siguientes secciones de
http://msdn.microsoft.com/es-es/library/ms228593(printer).aspx ] .
Conceptos
Como se explica en Informacin general sobre interfaces [ http://msdn.microsoft.com/eses/library/s3et34z3(printer).aspx ] , las interfaces describen las propiedades, mtodos y eventos de una clase sin proporcionar ninguna implementacin.
2.
Agregue instrucciones que definan las propiedades, mtodos y eventos que sean compatibles con la interfaz. Por ejemplo, el siguiente cdigo define una funcin, una propiedad y un evento. Visual Basic Copiar cdigo
Interface IAsset Event ComittedChange(ByVal Success As Boolean) Property Division() As String Function GetID() As Integer End Interface
End Class
3.
Agregue procedimientos para implementar las propiedades, mtodos y eventos de la clase como en el cdigo siguiente, que se basa en el ejemplo del paso anterior: Visual Basic Copiar cdigo
Get Return divisionValue End Get Set(ByVal value As String) divisionValue = value RaiseEvent ComittedChange(True) End Set End Property
Return IDValue
End Function
Public Sub New(ByVal Division As String, ByVal ID As Integer) Me.divisionValue = Division Me.IDValue = ID End Sub End Class
Vea tambin
Implementacin Puede notar que la sintaxis utilizada para declarar los miembros de la interfaz es diferente de la sintaxis utilizada para declarar los miembros de la clase. Esta diferencia refleja el hecho de que las interfaces no pueden contener cdigo de implementacin.
Class ImplementationClass
Si est trabajando dentro del entorno de desarrollo integrado, el Editor de cdigo proporciona la instruccin End Class correspondiente al presionar ENTRAR. 2. Agregue la siguiente instruccin Implements a ImplementationClass, que da nombre a la interfaz que implementa la clase: Visual Basic Copiar cdigo
Implements TestInterface
Cuando se muestra separada de otros elementos en la parte superior de la clase o estructura, la instruccin Implements indica que la clase o estructura implementa una interfaz. Si est trabajando dentro del entorno de desarrollo integrado, el Editor de cdigo implementa los miembros de clase requeridos por TestInterface al presionar ENTRAR, y se puede omitir el paso siguiente. 3. Si no est trabajando dentro del entorno de desarrollo integrado, debe implementar todos los miembros de la interfaz MyInterface. Agregue el cdigo siguiente a ImplementationClass para implementar Event1, Method1 y Prop1: Visual Basic
Copiar cdigo
Public Property Prop1() As Integer Implements TestInterface.Prop1 Get End Get Set(ByVal value As Integer) End Set End Property
La instruccin Implements asigna un nombre a la interfaz y al miembro de la interfaz que se est implementando. 4. Para finalizar la definicin de Prop1, agregue un campo privado a la clase que almacen el valor de la propiedad: Visual Basic Copiar cdigo
Devuelva el valor de pval desde el descriptor de acceso get de la propiedad. Visual Basic Copiar cdigo
Return pval
Establezca el valor de pval en el descriptor de acceso set de la propiedad. Visual Basic Copiar cdigo
pval = value
5.
Para finalizar la definicin de Method1, agregue el cdigo siguiente: Visual Basic Copiar cdigo
Al declarar testInstance como WithEvents, la clase Form1 puede controlar sus eventos. 3. Agregue el siguiente controlador de eventos a la clase Form1 para controlar los eventos desencadenados por testInstance: Visual Basic Copiar cdigo
Sub EventHandler() Handles testInstance.Event1 MsgBox("The event handler caught the event.") End Sub
4.
Agregue una subrutina denominada Test a la clase Form1 para probar la clase de implementacin: Visual Basic
Copiar cdigo
Dim T As New ImplementationClass ' Assign the class instance to the interface. ' Calls to the interface members are ' executed through the class instance. testInstance = T ' Set a property. testInstance.Prop1 = 9 ' Read the property. MsgBox("Prop1 was set to " & testInstance.Prop1) ' Test the method and raise an event.
El procedimiento Test crea una instancia de la clase que implementa MyInterface, asigna esa instancia al campo testInstance, define una propiedad y ejecuta un mtodo a travs de la interfaz. 5. Agregue cdigo para llamar al procedimiento Test desde el procedimiento Form1 Load del formulario de inicio: Visual Basic Copiar cdigo
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load Test() ' Test the class. End Sub
6.
Ejecute el procedimiento Test presionando F5. Aparecer el mensaje "Prop1 se ha definido como 9". Tras hacer clic en Aceptar, aparecer el mensaje "El parmetro X de Method1 es 5". Al hacer clic en Aceptar, aparecer el mensaje "El controlador de eventos ha interceptado el evento".
Se pueden heredar los constructores? 1 - Si. La clase derivada tiene acceso sin nigun problema al constructor de la clase base 2 - No. Es necesario declarar de manera explicita el constructor en la clase derivada. 3 - Si. Siempre y cuando el contructor de la clase base no este sobrecargado 4 - Si. Siempre y cuando el constructor sea de tipo Public
Un requerimiento de su compania es implementar una clase llamada InicioSesion, dicha clase pertenece al espacio de Nombres Usuario. Le solicitan que los elementos declarados dentro de esta clase puedan ser accedidos por la misma clase y por cualquier clase del espacio de Nombres Usuario, pero ni la clase ni los elementos de ella pueden ser vistos desde otros espacios de nombres. Cual es la solucion indicada? 1 - Declaro los elementos de la clase InicioSesion de tipo public, y la clase de tipo Private 2 - Declaro los elementos de la clase InicioSesion de tipo Friend (Internal), y la clase de tipo Private 3 - Declaro los elementos de la clase InicioSesion de tipo Protected, y la clase de tipo Private 4 - Declaro los elementos de la clase InicioSesion de tipo Friend (Internal), y la clase de tipo Public