Programación orientada a objetos (C# y Visual Basic)
Todos los lenguajes administrados de .NET Framework, como Visual Basic y C#, proporcionan plena compatibilidad con la programación orientada a objetos, incluidos la encapsulación, la herencia y el polimorfismo.
La encapsulación significa que un grupo de propiedades, métodos y otros miembros relacionados se tratan como si de una sola unidad u objeto se tratase.
Herencia describe la posibilidad de crear nuevas clases basadas en una clase existente.
Polimorfismo significa que puede tener múltiples clases que se pueden utilizar de forma intercambiable, si bien cada clase implementa las mismas propiedades o los mismos métodos de maneras diferentes.
En esta sección se describen los conceptos siguientes:
Clases y objetos
Miembros de la clase
Propiedades y campos
Métodos
Constructores
Destructores
Eventos
Clases anidadas
Modificadores y niveles de acceso
Creación de instancias de las clases
Clases y miembros estáticos (compartidos)
Tipos anónimos
Herencia
- Reemplazar miembros
Interfaces
Genéricos
Delegados
Clases y objetos
Los términos clase y objeto se usan a veces indistintamente pero, en realidad, las clases describen el tipo de los objetos, mientras que los objetos son instancias de clases que se pueden usar. Así, la acción de crear un objeto se denomina creación de instancias. Con la analogía de plano, una clase es un plano y un objeto es un edificio construido a partir de ese plano.
Para definir una clase:
Class SampleClass
End Class
class SampleClass
{
}
Tanto Visual Basic como C# también proporcionan una versión ligera de las clases denominadas estructuras, que resultan útiles cuando es necesario crear una matriz grande de objetos y no se desea usar demasiada memoria para ello.
Para definir una estructura:
Structure SampleStructure
End Structure
struct SampleStruct
{
}
Para obtener más información, vea:
Visual Basic
C#
Miembros de clase
Cada clase puede tener distintos miembros de clase, entre los que se incluyen las propiedades que describen los datos de clase, los métodos que definen el comportamiento de la clase y los eventos que proporcionan comunicación entre distintos objetos y clases.
Propiedades y campos
Los campos y propiedades representan información que contiene un objeto. Los campos se parecen a las variables ya que se pueden leer y establecer directamente.
Para definir un campo:
Class SampleClass
Public SampleField As String
End Class
Class SampleClass
{
public string sampleField;
}
Las propiedades tienen procedimientos get y set, que proporcionan un mayor control sobre la forma en que se establecen o devuelven los valores.
Tanto C# como Visual Basic permiten crear un campo privado para almacenar el valor de propiedad o bien usar las denominadas propiedades de implementación automática que crean este campo en segundo plano automáticamente y proporcionan la lógica básica para los procedimientos de propiedad.
Para definir una propiedad implementada automáticamente:
Class SampleClass
Public Property SampleProperty as String
End Class
class SampleClass
{
public int SampleProperty { get; set; }
}
Si necesita realizar algunas operaciones adicionales para leer y escribir el valor de propiedad, defina un campo para almacenar el valor de propiedad y proporcione la lógica básica para almacenarlo y recuperar lo:
Class Samplelass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
class SampleClass
{
private int _sample;
public int Sample
{
// Return the value stored in a field.
get { return _sample; }
// Store the value in the field.
set { _sample = value; }
}
}
La mayoría de las propiedades tienen métodos o procedimientos tanto para establecer como para obtener el valor de propiedad. Sin embargo, se pueden crear propiedades de solo lectura o solo escritura para restringir su modificación o lectura. En Visual Basic se pueden usar las palabras clave ReadOnly y WriteOnly. En C#, se puede omitir el método de propiedad get o set. Sin embargo, tanto en Visual Basic como en C#, las propiedades implementadas automáticamente no pueden ser de solo lectura o de solo escritura.
Para obtener más información, vea:
Visual Basic
C#
Métodos
Un método es una acción que un objeto puede realizar.
Nota
En Visual Basic hay dos formas de crear un método: se usa la instrucción Sub si el método no devuelve un valor o bien se usa la instrucción Function si el método devuelve un valor.
Para definir un método de una clase:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
class SampleClass
{
public int sampleMethod(string sampleParam)
{
// Insert code here
}
}
Una clase puede tener varias implementaciones o sobrecargas del mismo método que se diferencian en el número de parámetros o de tipos de parámetro.
Para sobrecargar un método:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
public int sampleMethod(string sampleParam) {};
public int sampleMethod(int sampleParam) {}
En la mayoría de los casos, un método se declara dentro de una definición de clase. Sin embargo, tanto Visual Basic como C# también admiten los métodos de extensión, que permiten agregar métodos a una clase existente fuera de la definición de la clase en sí.
Para obtener más información, vea:
Visual Basic
C#
Constructores
Los constructores son métodos de clase que se ejecutan automáticamente cuando se crea un objeto de un tipo determinado. Normalmente, los constructores inicializan los miembros de datos del nuevo objeto. Un constructor solo puede ejecutarse una vez cuando se crea una clase. Además, el código del constructor siempre se ejecuta antes que cualquier otro código en una clase. Sin embargo, puede crear varias sobrecargas del constructor de la misma forma que para cualquier otro método.
Para definir un constructor para una clase:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
public class SampleClass
{
public SampleClass()
{
// Add code here
}
}
Para obtener más información, vea:
Visual Basic
C#
Destructores
Los destructores se utilizan para destruir instancias de clases. En .NET Framework, el recolector de elementos no utilizados administra automáticamente la asignación y la liberación de memoria para los objetos administrados en la aplicación. Sin embargo, es posible que aún se necesiten destructores para limpiar cualquiera de los recursos no administrados creados por la aplicación. Solo puede haber un destructor para una clase.
Para obtener más información acerca de los destructores y la recolección de elementos no utilizados en .NET Framework, vea recolección de elementos no utilizados.
Eventos
Cuando ocurre algo interesante, los eventos habilitan una clase u objeto para notificarlo a otras clases u objetos. La clase que envía (o genera) el evento recibe el nombre de publicador y las clases que reciben (o controlan) el evento se denominan suscriptores. Para obtener más información sobre los eventos y la forma en que se generan y controlan, vea Controlar y provocar eventos.
Visual Basic
Para declarar eventos, use Event (Instrucción).
Para generar eventos, use RaiseEvent (Instrucción).
Para especificar controladores de eventos de forma declarativa, use la instrucción WithEvents (Visual Basic) y la cláusula Handles (Cláusula, Visual Basic).
Para poder agregar, quitar y cambiar de forma dinámica el controlador de eventos asociado a un evento, use AddHandler (Instrucción) y RemoveHandler (Instrucción) junto con AddressOf (Operador) (Visual Basic).
C#
Para declarar un evento en una clase, use la palabra clave event (Referencia de C#).
Para generar un evento, invoque al delegado de eventos.
Para suscribirse a un evento, use el operador +=; para anular la suscripción de un evento, use el operador -=.
Clases anidadas
Una clase definida dentro de otra se denomina anidada. De forma predeterminada, una clase anidada es privada.
Class Container
Class Nested
' Add code here.
End Class
End Class
class Container
{
class Nested
{
// Add code here.
}
}
Para crear una instancia de la clase anidada, use el nombre de la clase contenedora seguido de un punto y seguido, a continuación, del nombre de la clase anidada:
Dim nestedInstance As Container.Nested = New Container.Nested()
Container.Nested nestedInstance = new Container.Nested()
Modificadores y niveles de acceso
Todas las clases y miembros de clase pueden especificar el nivel de acceso que proporcionan a otras clases mediante los modificadores de acceso.
Están disponibles los siguientes modificadores de acceso:
Modificador de Visual Basic |
Modificador de C# |
Definición |
---|---|---|
Puede obtener acceso al tipo o miembro cualquier otro código del mismo ensamblado o de otro ensamblado que haga referencia a éste. |
||
Solamente puede obtener acceso al tipo o miembro el código de la misma clase. |
||
Solamente puede obtener acceso al tipo o miembro el código de la misma clase o de una clase derivada. |
||
Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado, pero no de un ensamblado distinto. |
||
Protected Friend |
protected internal |
Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado o cualquier clase derivada de otro ensamblado. |
Para obtener más información, vea Niveles de acceso en Visual Basic y Modificadores de acceso (Guía de programación de C#).
Creación de instancias de las clases
Para crear un objeto, debe crear una o varias instancias de una clase.
Dim sampleObject as New SampleClass()
SampleClass sampleObject = new SampleClass();
Una vez creadas las instancias de una clase, puede asignar valores a las propiedades y los campos de la instancia, así como invocar métodos de clase.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
// Set a property value.
sampleObject.sampleProperty = "Sample String";
// Call a method.
sampleObject.sampleMethod();
Para asignar valores a las propiedades durante el proceso de creación de instancias de una clase, use los inicializadores de objeto:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
// Set a property value.
SampleClass sampleObject = new SampleClass
{ FirstProperty = "A", SecondProperty = "B" };
Para obtener más información, vea:
Visual Basic
C#
Clases y miembros estáticos (compartidos)
Un miembro estático (compartido en Visual Basic) de la clase es una propiedad, un procedimiento o un campo que comparten todas las instancias de una clase.
Para definir un miembro estático (compartido):
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
static class SampleClass
{
public static string SampleString = "Sample String";
}
Para obtener acceso al miembro estático (compartido), use el nombre de la clase sin crear un objeto perteneciente a esta:
MsgBox(SampleClass.SampleString)
Console.WriteLine(SampleClass.SampleString);
Las clases estáticas (compartidas) de C# y los módulos de Visual Basic solamente tienen miembros estáticos (compartidos) y no se pueden crear instancias de los mismos. Además, los miembros estáticos (compartidos) tampoco pueden tener acceso a las propiedades, los campos o los métodos no estáticos (no compartidos).
Para obtener más información, vea:
Visual Basic
C#
Tipos anónimos
Los tipos anónimos permiten crear objetos sin escribir una definición de clase para el tipo de datos. En su lugar, el compilador genera una clase. La clase no tiene ningún nombre que se pueda usar y contiene las propiedades especificadas al declarar el objeto.
Para crear una instancia de un tipo anónimo:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
// sampleObject is an instance of a simple anonymous type.
var sampleObject =
new { FirstProperty = "A", SecondProperty = "B" };
Para obtener más información, vea:
Visual Basic: Tipos anónimos (Visual Basic)
Herencia
La herencia permite crear una nueva clase que reutiliza, extiende y modifica el comportamiento que se define en otra clase. La clase cuyos miembros se heredan se denomina clase base y la clase que hereda esos miembros se denomina clase derivada. Sin embargo, todas las clases de C# y Visual Basic heredan implícitamente de la clase Object que admite la jerarquía de clases .NET y proporciona servicios de bajo nivel a todas las clases.
Nota
Los lenguajes administrados de .NET Framework no admiten la herencia múltiple, es decir, solo se puede especificar una clase base para una clase derivada.
Para heredar de una clase base:
Class DerivedClass
Inherits BaseClass
End Class
class DerivedClass:BaseClass{}
De forma predeterminada, todas las clases se pueden heredar. Sin embargo, puede especificar si una clase no se debe usar como clase base o bien crear una clase que solo se pueda usar como clase base.
Para especificar que una clase no se puede usar como clase base:
NotInheritable Class SampleClass
End Class
public sealed class A { }
Para especificar que una clase se puede usar solo como clase base y no se pueden crear instancias de esta:
MustInherit Class BaseClass
End Class
public abstract class B { }
Para obtener más información, vea:
Visual Basic
C#
Reemplazar miembros
De forma predeterminada, una clase derivada hereda todos los miembros de su clase base. Si desea cambiar el comportamiento del miembro heredado, debe invalidarlo. Es decir, se puede definir una nueva implementación del método, la propiedad o el evento en la clase derivada.
Los siguientes modificadores se utilizan para controlar cómo se reemplazan propiedades y métodos:
Modificador de Visual Basic |
Modificador de C# |
Definición |
---|---|---|
Permite invalidar un miembro de una clase derivada. |
||
Invalida un miembro virtual (invalidable) definido en la clase base. |
||
No compatible |
Impide que un miembro se invalide en una clase heredera. |
|
Requiere que se invalide un miembro de clase en la clase derivada. |
||
Oculta un miembro heredado de una clase base. |
Interfaces
Las interfaces, como las clases, definen un conjunto de propiedades, métodos y eventos. Pero de forma contraria a las clases, las interfaces no proporcionan implementación. Se implementan como clases y se definen como entidades separadas de las clases. Una interfaz representa un contrato, en el cual una clase que implementa una interfaz debe implementar cualquier aspecto de dicha interfaz exactamente como esté definido.
Para definir una interfaz:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
interface ISampleInterface
{
void doSomething();
}
Para implementar una interfaz en una clase:
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
class SampleClass : ISampleInterface
{
void ISampleInterface.doSomething()
{
// Method implementation.
}
}
Para obtener más información, vea:
Visual Basic
C#
Genéricos
Las clases, las estructuras, las interfaces y los métodos de .NET Framework pueden escribir parámetros que definen los tipos de objetos que estos pueden almacenar o usar. El ejemplo más común de elementos genéricos es una colección, donde se puede especificar el tipo de objetos que se va a almacenar en una colección.
Para definir una clase genérica:
Class SampleGeneric(Of T)
Public Field As T
End Class
Public class SampleGeneric<T>
{
public T Field;
}
Para crear una instancia de una clase genérica:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
SampleGeneric<string> sampleObject = new SampleGeneric<string>();
sampleObject.Field = "Sample string";
Para obtener más información, vea:
Delegados
Un delegado es un tipo que define una firma de método y que puede proporcionar una referencia a cualquier método con una firma compatible. Puede invocar (o llamar) al método a través del delegado. Los delegados se utilizan para pasar métodos como argumentos a otros métodos.
Nota
Los controladores de eventos no son más que métodos que se invocan a través de delegados.Para obtener más información sobre el uso de delegados en el control de eventos, vea Controlar y provocar eventos.
Para crear un delegado:
Delegate Sub SampleDelegate(ByVal str As String)
public delegate void SampleDelegate(string str);
Para crear una referencia a un método que coincida con la firma especificada por el delegado:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
class SampleClass
{
// Method that matches the SampleDelegate signature.
public static void sampleMethod(string message)
{
// Add code here.
}
// Method that instantiates the delegate.
void SampleDelegate()
{
SampleDelegate sd = sampleMethod;
sd("Sample string");
}
}
Para obtener más información, vea:
Visual Basic
C#