Tiempo de lectura: ~ 7 minutos
# Autodesk
# BIM
# Revit API
Actualizado 20 de enero de 2025
Hoy exploraremos el concepto de interfaces en C# de una manera sencilla, usando analogías del sector de la construcción para que cualquier persona, incluso sin conocimientos previos en programación, pueda entenderlo. Además, aprenderás cómo implementar un ISelectionFilter de la API de Revit, una herramienta esencial para profesionales de la construcción que utilizan software de modelado.
Imagina que estás construyendo una casa. Tienes diferentes especialistas: electricistas, plomeros, carpinteros, etc. Cada uno tiene su propio conjunto de herramientas y habilidades, pero todos deben seguir ciertas normas básicas para que la casa sea segura y funcional. En programación, un interface funciona de manera similar: es un contrato que define qué métodos y propiedades debe tener una clase, sin especificar cómo se implementan esos métodos.
Piensa en un interface como un plano arquitectónico. El plano define qué habitaciones debe tener la casa, dónde están ubicadas las puertas y ventanas, pero no entra en detalles sobre cómo se construirán las paredes o se instalarán las tuberías. De la misma manera, un interface en C# define qué métodos y propiedades debe tener una clase, pero deja la implementación específica a quien lo desarrolle.
Flexibilidad: Permiten que diferentes clases implementen el mismo conjunto de métodos de diferentes maneras.
Mantenibilidad: Facilitan la actualización y el mantenimiento del código, ya que los cambios en un interface se reflejan en todas las clases que lo implementan.
Reusabilidad: Promueven la reutilización de código, ya que múltiples clases pueden compartir el mismo interface.
Siguiendo con la analogía de la casa, imagina que el plano arquitectónico (interface) es el mismo para todas las casas que construyes. Aunque cada casa puede tener materiales diferentes o estilos únicos, todas cumplen con las mismas especificaciones básicas. Esto facilita la construcción y asegura que todas las casas sean funcionales y seguras.
Vamos a ver un ejemplo básico de cómo se implementa un interface en C#. Supongamos que queremos definir un interface para diferentes tipos de vehículos.
Paso 1: Definir el Interface
IVehiculo.cs1public interface IVehiculo 2{ 3 void Arrancar(); 4 void Detener(); 5 int ObtenerVelocidad(); 6}
Paso 2: Implementar el Interface en una Clase
Coche.cs1public class Coche : IVehiculo 2{ 3 private int velocidad = 0; 4 5 public void Arrancar() 6 { 7 velocidad = 10; 8 Console.WriteLine("El coche ha arrancado."); 9 } 10 11 public void Detener() 12 { 13 velocidad = 0; 14 Console.WriteLine("El coche se ha detenido."); 15 } 16 17 public int ObtenerVelocidad() 18 { 19 return velocidad; 20 } 21}
Explicación
1. Definición del Interface (IVehiculo): Aquí especificamos que cualquier clase que implemente IVehiculo debe tener los métodos Arrancar, Detener y ObtenerVelocidad.
2. Implementación en la Clase (Coche): La clase Coche implementa IVehiculo, proporcionando las funcionalidades específicas de cada método.
Volviendo a nuestra analogía, es como si tuvieras un plano (IVehiculo) que todas las clases de vehículos deben seguir. Cada vehículo, ya sea un coche, una bicicleta o una motocicleta, tiene su propia manera de arrancar, detenerse y medir su velocidad, pero todos cumplen con el mismo contrato básico definido por el plano.
En el mundo de la programación orientada a objetos, herencia e interfaces son dos conceptos fundamentales que a menudo se utilizan para compartir y organizar código. Aunque ambos permiten reutilizar código y establecer relaciones entre clases, tienen diferencias clave en su propósito y funcionamiento.
¿Qué es la Herencia?
La herencia es un mecanismo por el cual una clase (llamada clase derivada o subclase) hereda propiedades y métodos de otra clase (llamada clase base o superclase). Esto permite reutilizar código existente y establecer una relación jerárquica entre clases.
¿Qué es un Interface?
Como ya hemos visto, un interface es un contrato que define un conjunto de métodos y propiedades que una clase debe implementar, sin proporcionar la implementación en sí misma. Las interfaces permiten que clases no relacionadas compartan una misma "firma" de métodos y propiedades.
Herencia: Imagina que tienes un plano maestro para una serie de edificios de oficinas. Este plano define características comunes como la altura del edificio, el número de pisos y la distribución básica de las ventanas. Cada edificio que construyes basado en este plano maestro hereda estas características básicas, pero puede tener diferencias en detalles como el diseño interior o los materiales utilizados en la fachada.
Interfaces: Ahora, piensa en un estándar de seguridad que todos los edificios deben cumplir, independientemente de sus diseños específicos. Este estándar podría incluir cosas como la instalación de detectores de humo, salidas de emergencia y sistemas de extinción de incendios. Cada edificio debe implementar estos sistemas de acuerdo con el estándar, pero la forma en que se instalan o funcionan puede variar según las necesidades específicas del edificio.
Diferencias Clave
1. Relación entre Clases:
2. Reutilización de Código:
3. Flexibilidad:
Ejemplos de Herencia y Interfaces en C#
herencia.cs1public class Vehiculo 2{ 3 public void Arrancar() 4 { 5 Console.WriteLine("Vehículo arrancado."); 6 } 7 8 public void Detener() 9 { 10 Console.WriteLine("Vehículo detenido."); 11 } 12} 13 14public class Coche : Vehiculo 15{ 16 public int ObtenerVelocidad() 17 { 18 // Implementación específica para Coche 19 return 100; 20 } 21}
interfaces.cs1public interface IVehiculo 2{ 3 void Arrancar(); 4 void Detener(); 5 int ObtenerVelocidad(); 6} 7 8public class Coche : IVehiculo 9{ 10 private int velocidad = 0; 11 12 public void Arrancar() 13 { 14 velocidad = 10; 15 Console.WriteLine("El coche ha arrancado."); 16 } 17 18 public void Detener() 19 { 20 velocidad = 0; 21 Console.WriteLine("El coche se ha detenido."); 22 } 23 24 public int ObtenerVelocidad() 25 { 26 return velocidad; 27 } 28}
Ahora que entendemos qué es un interface y cómo implementarlo, veamos cómo usar el ISelectionFilter de la API de Revit. Revit es una herramienta de modelado de información de construcción (BIM) que permite a los profesionales de la construcción diseñar y gestionar edificios.
ISelectionFilter es un interface que permite filtrar los elementos que se pueden seleccionar en un modelo de Revit. Por ejemplo, podrías querer que solo se seleccionen puertas o ventanas, excluyendo otros elementos.
Paso 01: Definir la Clase que Implementa ISelectionFilter
FiltroPuertas.cs1using Autodesk.Revit.DB; 2using Autodesk.Revit.UI.Selection; 3 4public class FiltroPuertas : ISelectionFilter 5{ 6 public bool AllowElement(Element elem) 7 { 8 return elem.Category != null && elem.Category.Name == "Doors"; 9 } 10 11 public bool AllowReference(Reference reference, XYZ position) 12 { 13 return false; 14 } 15}
Paso 02: Usar el Filtro en una Selección
Command.cs1UIDocument uidoc = commandData.Application.ActiveUIDocument; 2Selection sel = uidoc.Selection; 3 4FiltroPuertas filter = new FiltroPuertas(); 5ICollection<ElementId> selected = sel.PickElementsByRectangle(filter, "Seleccione puertas");
Explicación
Clase FiltroPuertas: Implementa ISelectionFilter y define que solo se permitirán elementos cuya categoría sea "Doors" (Puertas).
Uso del Filtro: Al solicitar una selección de elementos en Revit, aplicamos el filtro para que solo se puedan seleccionar puertas.
Piensa en ISelectionFilter como una red de seguridad en una obra de construcción. Supongamos que solo quieres que los carpinteros puedan acceder a ciertas áreas donde se instalan puertas. El filtro actúa como esta red, permitiendo solo a los carpinteros (elementos de categoría "Doors") acceder a esas áreas específicas, manteniendo a otros trabajadores fuera.
Los interfaces en C# son herramientas poderosas que te permiten diseñar sistemas flexibles y mantenibles. Utilizando analogías de la construcción, hemos visto cómo un interface funciona como un plano arquitectónico, definiendo contratos que diversas clases pueden implementar de diferentes maneras. Además, hemos aplicado este conocimiento práctico al implementar el ISelectionFilter de la API de Revit, una habilidad valiosa para profesionales en el sector de la construcción que trabajan con modelos BIM.
Si estás comenzando en la programación con C#, dominar los interfaces te abrirá muchas puertas y te permitirá crear aplicaciones robustas y eficientes. ¡Buena suerte en tu viaje de aprendizaje!
Recibe semanalmente tutoriales, recursos, noticias sobre temas innovadores dentro del sector construcción y destaca profesionalmente.