Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NET
1.¿Qué es .NET? ¿Cuáles son sus principales características?
Es una plataforma gratuita y de codigo abierto que nos provee una serie de herramientas y programas para
construir distintos softwares, asi como el entorno necesario para ejecutarlo en distintos sistemas operativos y
tipos de arquitectura. Tiene como caracteristicas: ser multiplataforma (se puede utilizar en Windows, Linux,
MacOs), Open Source, multilenguaje, y Visual Basic (tiene una sintaxis similar al ingles).
2.¿Cómo se categorizan las versiones de .NET? Explique su relación con las políticas de soporte y
mantenimiento de dichas versiones.
Se categorizan en dos grandes grupos que determinan por cuántos años tendrán soporte:
Long-Term Support (LTS): Son versiones estables y que se actualizarán con poca frecuencia. Se garantiza su
soporte por 3 años desde su lanzamiento.
Current: Contienen las últimas mejoras y tienden a actualizarse con frecuencia. Reciben actualizaciones hasta
18 meses después de su lanzamiento.
Ambas reciben correcciones críticas relacionadas a temas de seguridad. Debemos mantenernos al día con
estas actualizaciones para obtener soporte.
3.¿Qué componentes forman parte de una implementación de .NET? Describa brevemente cada uno.
Common Language RunTime (CLR): programa encargado de administrar la ejecucion de un programa,
funciona como una maquina virtual que sirve de interprete e intermediario para darle instrucciones a la
maquina real, tambien administra recursos y la memoria.
Base Class Library (BCL): serie de bibliotecas con funcionalidades de uso general
Frameworks: define una forma de trabajo y nos brinda un conjunto de herramientas de alto nivel para
desarrollar un tipo de aplicación en concreto
Herramientas e infraestructura: lenguajes y sus compiladores MSBuild (motor para cargar y construir
aplicaciones), etc.
4.¿En qué se diferencia un marco de trabajo (framework) de una biblioteca (library)?
El resultado de la compilación serán archivos que contendrán el lenguaje intermedio y serán aquellos que se
distribuirán a los usuarios finales.
El sistema operativo invoca al Common Language Runtime, este compila el lenguaje intermedio a lenguaje
nativo (máquina).
6.Explique y compare tiempo de compilación y tiempo de ejecución.
Tiempo de compilacion: el intervalo de tiempo en el que un compilador compila código escrito en un lenguaje
de programación a una forma de código ejecutable por una máquina, este normalmente realiza un chequeo de
sintaxis y una optimización del código generado.
Tiempo de ejecución: el intervalo de tiempo en el que un programa de computadora se ejecuta en un sistema
operativo. Este tiempo se inicia con la puesta en memoria principal del programa, por lo que el sistema
operativo comienza a ejecutar sus instrucciones. Y finaliza en el momento en que este envía al sistema
operativo la señal de terminación, sea esta una terminación normal, en que el programa tuvo la posibilidad de
concluir sus instrucciones satisfactoriamente, o una terminación anormal, en el que el programa produjo algún
error y el sistema debió forzar su finalización.
C#
es una técnica de la ingeniería de software para reestructurar un código fuente, alterando su estructura interna
sin cambiar su comportamiento externo. Esta técnica consiste en modificar el código fuente para mejorar su
consistencia interna y su claridad. La refactorización no arregla errores ni añade funcionalidad, sólo mejora la
comprensión, estructura y diseño del código.
Namespaces
1.¿Qué es un namespace y cuál es su función principal?
Son una agrupación lógica de clases y otros elementos del código fuente. Así como clasificamos nuestros
archivos dentro de distintos directos del sistema operativo, podemos organizar el código fuente de C# y sus
componentes en distintos espacios de nombres.
2.¿Puedo tener distintos namespaces dentro de un mismo proyecto o ensamblado de .NET?
Si
3.¿Para qué se usa la directiva using?
Permite la especificación de una llamada a un método sin el uso obligatorio de un nombre completamente
cualificado (nombre completo incluyendo el espacio de nombres).
4.¿Para qué se usa la directiva alias?
Permite utilizar un nombre distinto para un espacio de nombres. Se suele utilizar para abreviar nombres largos.
Sobrecarga
1. ¿Qué significa sobrecargar un método o constructor? Sobrecargar un método o constructor significa tener
múltiples definiciones del mismo con el mismo nombre en una clase, pero con diferentes parámetros. Cada
definición tiene una lista de parámetros única.
2. ¿Qué debe cambiar para que la sobrecarga de un método o constructor sea válida? Para que la sobrecarga
sea válida, al menos uno de los siguientes debe ser diferente en cada definición:
- El número de parámetros.
- El tipo de al menos uno de los parámetros.
3. ¿La sobrecarga se resuelve en tiempo de ejecución o en tiempo de compilación? La sobrecarga se resuelve en
tiempo de compilación, cuando el compilador determina cuál de las definiciones sobrecargadas se debe llamar
según el contexto de la llamada.
4. ¿Cómo se distingue a qué sobrecarga llamar? El compilador distingue a qué sobrecarga llamar basándose en
el número, tipo y orden de los argumentos proporcionados en la llamada al método o constructor.
5. ¿Se tiene en cuenta el nombre o identificador de los parámetros de entrada para una sobrecarga? No, el
nombre de los parámetros no se tiene en cuenta en la sobrecarga; solo importa su tipo, número y orden.
6. ¿Se tiene en cuenta el modificador de visibilidad para una sobrecarga? No, el modificador de visibilidad (como
public o private) no afecta la sobrecarga. Dos métodos o constructores pueden tener diferentes modificadores
de visibilidad y seguir siendo sobrecargas válidas.
7. ¿Se tiene en cuenta el tipo de retorno para una sobrecarga? No, el tipo de retorno no se tiene en cuenta en la
sobrecarga. Dos definiciones con la misma lista de parámetros pero con tipos de retorno diferentes no son
consideradas sobrecargas válidas.
8. ¿Los métodos pueden tener el mismo nombre que otros elementos de una misma clase? (atributos,
propiedades, etc) No, en una misma clase no se pueden tener elementos con el mismo nombre,
independientemente de si son métodos, atributos o propiedades.
9. Mencione dos razones por las cuales se sobrecargan los métodos. Las dos razones principales para
sobrecargar métodos son:
1. Proporcionar una funcionalidad similar pero con diferentes tipos de entrada o parámetros.
2. Ofrecer una interfaz más amigable o intuitiva para los usuarios, permitiéndoles utilizar el método de
diferentes maneras según sus necesidades.
10. ¿Los métodos estáticos pueden ser sobrecargados? Sí, los métodos estáticos pueden ser sobrecargados de la
misma manera que los métodos de instancia.
11. ¿Agregar el modificador “static” sin cambiar los parámetros de entrada es una sobrecarga válida? No, agregar
el modificador "static" sin cambiar los parámetros de entrada no es una sobrecarga válida. La sobrecarga se
basa en los parámetros, no en los modificadores.
12. ¿Agregar un modificador “out” o “ref” en la firma del método sin cambiar nada más es una sobrecarga válida?
No, agregar los modificadores "out" o "ref" sin cambiar nada más en la firma del método no es una sobrecarga
válida. Los modificadores no afectan la sobrecarga.
13. ¿Cambiar el tipo de retorno sin cambiar los parámetros de entrada es una sobrecarga válida? No, cambiar el
tipo de retorno sin cambiar los parámetros de entrada no es una sobrecarga válida. La sobrecarga se basa
únicamente en los parámetros.
14. ¿Se pueden sobrecargar los constructores estáticos? ¿Por qué? No, los constructores estáticos no pueden ser
sobrecargados. Esto se debe a que los constructores estáticos se ejecutan automáticamente cuando se carga
la clase en memoria y no se llaman explícitamente.
15. ¿Se puede llamar a un constructor estático con el operador “this()”? No, no se puede llamar a un constructor
estático con el operador "this()" ni con "new" ya que son invocados automáticamente.
16. ¿Se puede llamar a constructores de otras clases con el operador “this()”? No, el operador "this()" solo se
puede usar para llamar a constructores dentro de la misma clase. Para llamar a constructores de otras clases,
se utiliza "base()" en el caso de herencia.
17. ¿Se puede sobrecargar un constructor privado? Sí, se pueden sobrecargar los constructores privados dentro
de la misma clase. La accesibilidad privada permite que estos constructores sean invocados solo desde dentro
de la clase.
18. ¿Qué es un operador? Un operador es un símbolo o palabra reservada que realiza una operación específica
en operandos para producir un resultado. Por ejemplo, "+" es un operador de suma.
19. ¿En qué se diferencian un operador unario y un operador binario? De un ejemplo de cada uno. Un operador
unario trabaja con un solo operando, como el operador de negación "-". Un operador binario trabaja con dos
operandos, como el operador de suma "+".
20. ¿Qué varía en la sintaxis de la sobrecarga de operadores unarios y binarios? La sintaxis de la sobrecarga de
operadores unarios y binarios varía en la firma del método de sobrecarga. Para operadores unarios, no se
necesita un segundo operando, mientras que para operadores binarios, se necesitan dos operandos.
21. ¿Se pueden sobrecargar los operadores de operación y asignación (+=, -=,=, /=)? ¿Por qué? Sí, los
operadores de operación y asignación se pueden sobrecargar. Esto permite definir el comportamiento
personalizado de dichos operadores en tipos personalizados.
22. ¿Cuál es la diferencia entre un operador de conversión implícito y uno explícito? (En finalidad, declaración y
aplicación) Un operador de conversión implícito se utiliza para convertir automáticamente un tipo en otro
cuando sea necesario y es seguro. Un operador de conversión explícito requiere una conversión explícita por
parte del programador para convertir un tipo en otro.
23. Los operadores de casteo “(T)x” no se pueden sobrecargar. ¿Cuál es la alternativa? La alternativa es definir
métodos de conversión explícita o implícita en la clase para permitir la conversión personalizada entre tipos.
24. ¿Cuál es la diferencia entre castear (casting), convertir (converting) y parsear (parsing)? Castear (casting) se
refiere a la conversión de tipos en tiempo de compilación utilizando operadores de casting como (int)x.
Convertir (converting) se refiere a la conversión entre tipos en tiempo de ejecución utilizando métodos de
conversión definidos en la clase.
Parsear (parsing) se utiliza para convertir datos de cadena en otros tipos, generalmente utilizando métodos de
análisis como Int32.Parse().
Windows Form
1. ¿Los formularios son objetos? Sí, los formularios en Windows Forms son objetos. Son instancias de la clase
System.Windows.Forms.Form.
2. ¿En qué parte del código se instancia el primer formulario? El primer formulario generalmente se instancia en
el método Main() del programa, que se encuentra en la clase Program.cs o en el punto de entrada principal del
proyecto.
3. ¿De qué clase heredan/derivantodos los formularios? Todos los formularios en Windows Forms derivan de la
clase base System.Windows.Forms.Form.
4. ¿Qué es una partial class o clase parcial? Una partial class o clase parcial es una característica de C# que
permite dividir la definición de una clase en múltiples archivos. Esto es útil para separar la lógica de
presentación y el código generado automáticamente.
5. ¿Puedo agregar parámetros de entrada al constructor de la clase del formulario? ¿Puedo sobrecargarlo? ¿Por
qué? Sí, puedes agregar parámetros de entrada al constructor de la clase del formulario y sobrecargarlo según
tus necesidades. Esto es útil para pasar datos o configuraciones específicas al formulario al crear instancias.
6. ¿Se pueden declarar nuevos campos/atributos/propiedades dentro del formulario? ¿Por qué? Sí, puedes
declarar nuevos campos, atributos y propiedades dentro del formulario. Esto te permite mantener datos y lógica
específica del formulario, como controles personalizados o datos relacionados con la interfaz de usuario.
7. ¿Cuál es la diferencia entre los métodos Show y ShowDialog? El método Show() muestra un formulario de
manera no modal, lo que significa que permite al usuario interactuar con otros formularios mientras el
formulario está visible. El método ShowDialog() muestra un formulario de manera modal, lo que bloquea la
interacción con otros formularios hasta que se cierre el formulario modal.
8. ¿Qué es un formulario MDI? ¿Y uno SDI? MDI (Interfaz de Documento Múltiple) se refiere a una aplicación que
permite abrir múltiples documentos o ventanas secundarias dentro de una ventana principal. SDI (Interfaz de
Documento Único) se refiere a una aplicación que muestra un único documento o ventana secundaria en una
ventana principal.
9. ¿Con qué propiedad indico que un formulario es un contenedor MDI? Para indicar que un formulario es un
contenedor MDI, debes establecer la propiedad IsMdiContainer del formulario en true.
10. ¿Modificando qué propiedad del formulario hijo indico cuál es el formulario MDI padre? Puedes establecer la
propiedad MdiParent del formulario hijo para indicar cuál es el formulario MDI padre al que debe estar
acoplado.
11. ¿Qué es un evento en Windows Forms? Mencione algunos eventos de los controles o de los formularios y
explique cómo trabaja con ellos. ¿Cuál es el manejador del evento? Un evento en Windows Forms es una
acción o suceso que ocurre en un control o formulario, como hacer clic en un botón o cambiar el texto en un
cuadro de texto. Algunos eventos comunes incluyen Click, MouseDown, KeyPress, y muchos más. Para
responder a un evento, debes escribir un manejador de eventos que es un método que se ejecuta cuando
ocurre el evento.
12. Explique el ciclo de vida de los formularios asociándolo a sus eventos. El ciclo de vida de un formulario en
Windows Forms incluye los siguientes eventos clave:
Load: Se dispara cuando el formulario se carga por primera vez.
Activate: Se dispara cuando el formulario se convierte en el formulario activo.
Deactivate: Se dispara cuando el formulario pierde el foco.
FormClosing: Se dispara antes de que el formulario se cierre.
Closed: Se dispara después de que el formulario se cierra.
Dispose: Se dispara cuando el formulario se elimina de la memoria.
Arrays
1. ¿Qué es un array "jagged"? ¿En qué valor se inicializan sus elementos? Un array "jagged" es un array
multidimensional irregular en el que cada subarray puede tener una longitud diferente. Los elementos de un
array "jagged" se inicializan en null por defecto.
2. ¿Los arrays son objetos? Sí, los arrays son objetos en C#. Son instancias de la clase System.Array.
3. ¿Qué significa que en C# los arrays son de "base-cero"? Significa que los índices de los arrays comienzan en
0. El primer elemento tiene el índice 0, el segundo tiene el índice 1, y así sucesivamente.
4. Los arrays implementan la interfaz Enumerable, ¿qué es lo que esto les permite hacer? Al implementar la
interfaz Enumerable, los arrays pueden ser recorridos utilizando bucles foreach y se pueden usar en consultas
LINQ, lo que facilita la manipulación y búsqueda de datos en los arrays.
5. ¿Cómo se declara e instancia un array multidimensional? Puedes declarar e instanciar un array
multidimensional utilizando la siguiente sintaxis:
csharp
tipo[,] nombreArray = new tipo[filas, columnas];
6. ¿El método Array.Resize cambia el tamaño de la instancia de array proveída o genera una nueva con distinto
tamaño? ¿Por qué? El método Array.Resize cambia el tamaño de la instancia de array proveída. No crea un
nuevo array, sino que ajusta el tamaño del array existente. Esto se debe a que los arrays tienen una longitud
fija una vez creados.
Colecciones
1. ¿Cuál es la diferencia entre colecciones y matrices? Las colecciones son estructuras de datos dinámicas que
pueden cambiar de tamaño durante la ejecución, mientras que las matrices (arrays) tienen un tamaño fijo una
vez creadas.
2. ¿Cuál es la diferencia entre las colecciones genéricas y las no-genéricas? Las colecciones genéricas,
introducidas en versiones más recientes de C#, son tipos seguros en tiempo de compilación y proporcionan un
rendimiento mejorado al evitar conversiones de tipo. Las colecciones no genéricas almacenan objetos de tipo
"object" y requieren conversiones de tipo en tiempo de ejecución.
3. ¿Cuál es la diferencia entre una cola (Queue) y una pila (Stack). Asocie con los conceptos "FIFO" y "LIFO".
Una cola (Queue) sigue el principio FIFO (First-In-First-Out), lo que significa que el primer elemento en entrar
es el primero en salir. Una pila (Stack) sigue el principio LIFO (Last-In-First-Out), lo que significa que el último
elemento en entrar es el primero en salir.
4. Describa las siguientes colecciones: List, Dictionary, SortedList, ArrayList, Hashtable. Clasifíquelas en
genéricas o no-genéricas.
List: Colección genérica que almacena una secuencia ordenada de elementos.
Dictionary: Colección genérica que almacena pares clave-valor.
SortedList: Colección genérica que almacena pares clave-valor ordenados por clave.
ArrayList: Colección no genérica que almacena objetos de tipo "object".
Hashtable: Colección no genérica que almacena pares clave-valor.
5. ¿Por qué piensa que las colas y pilas no traen un método para ordenarlas? Piense en el uso de dichas
colecciones. Las colas y pilas están diseñadas para seguir el principio FIFO y LIFO, respectivamente, y no
están destinadas a ser ordenadas. Su uso principal es gestionar elementos en un orden específico y garantizar
que los elementos se retiren en el orden correcto.
6. ¿Cuál es la diferencia entre colas y pilas genéricas y no-genéricas? Las colas y pilas genéricas permiten
almacenar elementos de un tipo específico de manera segura en tiempo de compilación, mientras que las
colas y pilas no genéricas almacenan objetos de tipo "object", lo que requiere conversiones de tipo en tiempo
de ejecución y puede generar errores si se almacenan tipos incorrectos.
Encapsulamiento
1. Defina encapsulamiento / encapsulación en el contexto del paradigma orientado a objetos. El encapsulamiento
es uno de los conceptos fundamentales de la programación orientada a objetos (POO) y se refiere a la práctica
de ocultar los detalles internos de un objeto y exponer solo las partes relevantes para su uso externo. Esto se
logra definiendo atributos privados y proporcionando métodos públicos (getters y setters) para acceder y
modificar esos atributos de manera controlada.
2. Defina cada nivel de ocultamiento / accesibilidad de la programación orientada a objetos. Incluya la función del
modificador internal en C#. En C# y otros lenguajes orientados a objetos, los niveles de ocultamiento o
accesibilidad son:
public: Los miembros son accesibles desde cualquier lugar.
private: Los miembros solo son accesibles desde dentro de la clase que los contiene.
protected: Los miembros son accesibles desde dentro de la clase que los contiene y desde clases derivadas.
internal: Los miembros son accesibles solo desde dentro del mismo ensamblado (assembly).
El modificador internal en C# permite que los miembros de una clase sean accesibles desde cualquier clase
dentro del mismo ensamblado, pero no desde ensamblados externos.
Propiedades
1. ¿Qué es y para qué sirve una propiedad? Una propiedad es un miembro de una clase que proporciona un
mecanismo para leer (get) o escribir (set) el valor de un atributo privado de la clase. Las propiedades permiten
el encapsulamiento y la validación de datos, controlando el acceso a los atributos de la clase.
2. ¿Para qué sirve el descriptor de acceso get? El descriptor de acceso get se utiliza para obtener el valor de una
propiedad. Permite leer el valor del atributo privado o realizar algún cálculo antes de devolverlo.
3. ¿Para qué sirve el descriptor de acceso set? ¿Cuál es el papel de la palabra clave value? El descriptor de
acceso set se utiliza para establecer el valor de una propiedad. La palabra clave value se utiliza en el contexto
de set para representar el nuevo valor que se desea asignar a la propiedad. Permite realizar validaciones o
procesamientos antes de asignar el valor.
Enumerados
1. ¿Qué es un enumerado? ¿Cuál es su función? Un enumerado (enum) es un tipo de dato que permite definir un
conjunto de constantes con nombre. Su función es proporcionar un conjunto predefinido de valores que pueden
representar estados, opciones o valores específicos en un programa de manera más legible y mantenible.
2. ¿Un enumerado sólo puede estar anidado dentro de una clase? No, un enumerado puede estar definido en el
espacio de nombres (namespace) sin estar anidado dentro de una clase. Sin embargo, también puede estar
anidado dentro de una clase si se requiere ese nivel de encapsulación.
3. ¿Los tipos enumerados son de valor o de referencia? Los tipos enumerados (enums) son tipos de valor.
Representan un conjunto de valores constantes y se almacenan en la memoria como valores individuales
4. Por defecto, ¿cuál es el primer valor numérico de un enumerado? ¿Se pueden cambiar los valores por
defecto? Por defecto, el primer valor numérico de un enumerado es 0, y los siguientes valores incrementan en
1. Sin embargo, se pueden asignar valores personalizados a los miembros del enumerado, lo que permite
cambiar los valores por defecto.
Herencia
1. ¿Qué es la herencia en el contexto de la programación orientada a objetos? ¿Cuál es su propósito? La
herencia en programación orientada a objetos es un mecanismo que permite que una clase (clase derivada o
subclase) herede atributos y métodos de otra clase (clase base o superclase). El propósito de la herencia es
reutilizar y extender la funcionalidad de una clase existente, promoviendo la reutilización del código y la
organización jerárquica de las clases.
2. ¿Qué nombre recibe la clase que hereda y qué nombre recibe la clase que es heredada? La clase que hereda
se llama "clase derivada" o "subclase". La clase que es heredada se llama "clase base" o "superclase".
3. Explique el principio de sustitución de Liskov El principio de sustitución de Liskov establece que las instancias
de una clase derivada deben poder ser utilizadas en lugar de instancias de la clase base sin que se produzcan
efectos secundarios ni violaciones de la integridad del programa. Esto significa que una clase derivada debe
ser compatible en términos de comportamiento con su clase base.
4. ¿Qué significa que la herencia es transitiva? La herencia es transitiva en el sentido de que si la clase A hereda
de la clase B, y la clase B hereda de la clase C, entonces la clase A hereda indirectamente de la clase C. Esto
significa que la clase A obtiene propiedades y métodos tanto de la clase B como de la clase C.
5. ¿Se heredan los constructores? Sí, los constructores de la clase base se heredan en la clase derivada, pero no
se pueden llamar directamente desde la instancia de la clase derivada.
6. ¿Se heredan los miembros private de la clase base? No, los miembros privados (private) de la clase base no
se heredan en la clase derivada. Son inaccesibles desde la clase derivada.
7. ¿Qué es herencia múltiple? ¿Es posible en C#? ¿En qué se diferencia de la herencia simple? La herencia
múltiple es un concepto en el que una clase puede heredar miembros y comportamientos de múltiples clases
base. En C#, no es posible implementar herencia múltiple de clases. En su lugar, C# admite herencia de una
clase base única, pero permite la implementación de múltiples interfaces, lo que logra la reutilización de código
de manera más segura.
8. ¿Una clase pública puede heredar de una clase privada? No, una clase pública no puede heredar de una clase
privada. La clase base debe tener al menos un nivel de acceso igual o menos restrictivo que la clase derivada.
9. ¿Qué es una clase sellada (sealed)? Una clase sellada (sealed) es una clase que no puede ser heredada. Es
decir, no se pueden crear subclases de una clase sellada. Se utiliza para evitar la extensión de ciertas clases y
garantizar que su comportamiento permanezca inalterable.
10. ¿Una clase sellada puede heredar de otras clases (ser clase derivada)? No, una clase sellada no puede ser
una clase base ni heredar de otras clases. Es una clase final y no puede ser extendida.
11. ¿Cómo actúa el modificador “protected” en los miembros de la clase base para una clase derivada y cómo para
una clase no derivada? Relacionar la respuesta con los modificadores “public” y “private”. El modificador
"protected" permite que los miembros de la clase base sean accesibles desde la clase derivada, pero no desde
fuera de la jerarquía de herencia. Los miembros "protected" son como "public" dentro de la jerarquía de
herencia, pero como "private" fuera de ella.
12. ¿Qué pasa si la clase derivada no hace una llamada explícita a un constructor de la clase base? En esta
situación, ¿qué pasa si la clase base declaró explícitamente un constructor con parámetros de entrada? Si la
clase derivada no hace una llamada explícita a un constructor de la clase base, el compilador intentará
automáticamente llamar al constructor sin parámetros (constructor por defecto) de la clase base. Si la clase
base no tiene un constructor sin parámetros y solo tiene un constructor con parámetros, la clase derivada debe
llamar explícitamente a dicho constructor en su constructor.
13. La clase Alumno hereda de Persona. ¿Una instancia de Alumno es también de tipo Persona? Justifique. Sí,
una instancia de la clase Alumno también es de tipo Persona. Esto se debe a que Alumno hereda todos los
atributos y métodos de la clase Persona, por lo que puede ser tratada como una instancia de Persona además
de tener sus propios miembros específicos de Alumno.
14. La clase Alumno hereda de Persona. ¿Se puede hacer Persona persona = new Alumno()? ¿Por qué? Sí, se
puede hacer Persona persona = new Alumno();. Esto es posible debido a la relación de herencia, donde un
objeto de una clase derivada (Alumno) se puede asignar a una variable de la clase base (Persona). Sin
embargo, para acceder a los miembros específicos de Alumno, se necesita un casting explícito.
15. La clase Alumno hereda de Persona. ¿Se puede hacer Alumno alumno = new Persona()? ¿Por qué? No, no se
puede hacer Alumno alumno = new Persona();. Esto va en contra del principio de sustitución de Liskov, ya que
una instancia de la clase Persona no puede sustituir completamente a una instancia de la clase Alumno, ya que
Alumno puede tener miembros adicionales y comportamientos diferentes a los de Persona.
Polimorfismo
1. ¿Dónde reside la definición del método a sobrescribir? ¿Qué palabra clave se usa para definirlo? La definición
del método a sobrescribir reside en la clase base (superclase) y se utiliza la palabra clave virtual o abstract (en
caso de métodos abstractos) para indicar que el método puede ser sobrescrito en clases derivadas.
2. ¿Dónde reside la implementación del método sobrescrito? ¿Qué palabra clave se usa para implementarlo? La
implementación del método sobrescrito reside en la clase derivada (subclase) y se utiliza la palabra clave
override para indicar que se está proporcionando una implementación específica para ese método en la clase
derivada.
3. ¿La invocación de los métodos sobrescritos (override) se resuelve en tiempo de compilación o ejecución? ¿Y la
de los métodos sobrecargados (overload)? La invocación de los métodos sobrescritos se resuelve en tiempo
de ejecución (late binding), mientras que la de los métodos sobrecargados se resuelve en tiempo de
compilación (early binding).
4. ¿Cambia la firma de los métodos cuando los sobrescribimos (override)? ¿Y cuando los sobrecargamos
(overload)? Cuando sobrescribimos un método (override), la firma (nombre, tipo de retorno y parámetros) debe
ser la misma que la del método en la clase base. Y cuando sobrecargamos un método (overload), la firma debe
ser diferente, lo que significa que al menos uno de los siguientes elementos debe ser diferente: nombre, tipo de
retorno o lista de parámetros.
5. ¿Los métodos sobrescritos (override) se encuentran en la misma clase? ¿Y los métodos sobrecargados
(overload)? Los métodos sobrescritos (override) se encuentran en diferentes clases: el método base en la
clase base y el método sobrescrito en la clase derivada. Y los métodos sobrecargados (overload) pueden
encontrarse en la misma clase, donde varios métodos con el mismo nombre tienen parámetros diferentes.
6. ¿Qué es el polimorfismo en el contexto de la programación orientada a objetos? El polimorfismo es un
concepto que permite que objetos de diferentes clases se comporten de manera similar a través de una
interfaz común. Permite que se invoque un método en una clase base y, en tiempo de ejecución, se ejecute la
implementación específica de ese método en una clase derivada si se ha sobrescrito.
7. ¿Todos los objetos en C# son polimórficos? ¿Por qué? Sí, en C#, todos los objetos son polimórficos porque
heredan implícitamente de la clase base System.Object, lo que les permite ser tratados como objetos genéricos
y se pueden utilizar en polimorfismo.
PARCIAL