Preguntas de Entrevista en C# sobre Conceptos de Programación Orientada a Objetos

1. En C#, ¿qué palabra clave se emplea para la sobrescritura de métodos?

a) override

b) sobrecarga

c) estático

d) heredar

Explicación: "override" es la palabra clave utilizada para sobrescribir métodos en C#.

2. Considere el siguiente código que intenta definir una interfaz en C#:

public interface IArchivo{
    int variable;
    int BorrarArchivo(){
        variable = 3;
    }
    void MostrarArchivo();
}

¿Cuál de las siguientes descripciones es incorrecta? (Seleccione una opción)

a) El código tiene errores porque no se pueden definir variables en interfaces, por lo que la línea "int variable;" generará un error.

b) El código tiene errores porque el método de interfaz "BorrarArchivo" no puede tener implementación, por lo que no se debe escribir una función con cuerpo.

c) La definición "void MostrarArchivo();" es correcta, ya que las interfaces pueden carecer de valor de retorno.

d) La definición "void MostrarArchivo();" debería escribirse como "void MostrarArchivo(){};".

Explicación: En las interfaces, los métodos no deben contener implementación, por lo que la opción b describe un error válido.

3. En C#, la diferencia entre una interfaz y una clase base abstracta radica en que:

a) La clase base abstracta puede incluir métodos no abstractos, mientras que la interfaz solo puede contener métodos abstractos.

b) La clase base abstracta puede instanciarse, pero la interfaz no.

c) La clase base abstracta no puede instanciarse, pero la interfaz sí.

d) La clase base abstracta y la interfaz son equivalentes; no existen diferencias.

Explicación: Las clases abstractas pueden tener métodos con implementación, a diferencia de las interfaces.

4. Durante el desarrollo de un sistema de gestión de información bibliotecaria, se creó inicialmente una clase "LibroTexto" para libros de texto. Posteriormente, se añadieron revistas. ¿Cuál es la mejor alternativa de diseño?

a) Crear una nueva clase "Revista".

b) Crear una nueva clase "Revista" que herede de "LibroTexto".

c) Crear una clase base "Libro" y una nueva clase "Revista", donde tanto "Revista" como "LibroTexto" hereden de "Libro".

d) No crear ninguna clase; agregar atributos específicos de revistas a la clase "LibroTexto".

Explicación: Definir una clase base "Libro" permite reutilizar propiedades comunes y reducir la duplicación de código.

5. Seleccione las afirmaciones correctas sobre interfaces en C#:

a) Las interfaces pueden contener métodos virtuales.

b) Una clase puede implementar múltiples interfaces.

c) Las interfaces no pueden instanciarse.

d) Las interfaces pueden incluir métodos con implementación.

Explicación: Las afirmaciones b y c son correctas: las clases pueden implementar varias interfaces, y las interfaces no son instanciables.

6. ¿Cuál es la salida del siguiente código?

class Padre{
    public void Metodo1() { Console.WriteLine("Padre.M1"); }
    public virtual void Metodo2() { Console.WriteLine("Padre.M2"); }
}
class Hijo : Padre{
    new public void Metodo1() { Console.WriteLine("Hijo.M1"); }
    public override void Metodo2() { Console.WriteLine("Hijo.M2"); }
}
class EjemploHerencia{
    static void Main(){
        Hijo hijo = new Hijo();
        Padre padre = hijo;
        padre.Metodo1();
        hijo.Metodo1();
        padre.Metodo2();
        hijo.Metodo2();
    }
}

Posibles salidas:

1. Padre.M1 Hijo.M1 Padre.M2 Hijo.M2

2. Padre.M1 Hijo.M1 Hijo.M2 Hijo.M2

3. Padre.M1 Padre.M1 Hijo.M2 Hijo.M2

4. Hijo.M1 Hijo.M1 Hijo.M2 Hijo.M2

Explicación: La salida correcta es la opción 2: "Padre.M1 Hijo.M1 Hijo.M2 Hijo.M2", debido a la ocultación y sobrescritura de métodos.

7. En C#, para la herencia múltiple de interfaces, se utiliza ":" seguido de los nombres de las interfaces, separados por el símbolo:

a) "."

b) "->"

c) ","

d) "::"

Explicación: Se utiliza la coma (",") para separar múltiples interfaces al heredar.

8. ¿Cuál es la salida de este programa?

public abstract class ClaseA {
    public ClaseA() { Console.WriteLine("A"); }
    public virtual void Metodo() { Console.WriteLine("A.Metodo"); }
}
public class ClaseB : ClaseA {
    public ClaseB() { Console.WriteLine("B"); }
    public new void Metodo() { Console.WriteLine("B.Metodo"); }
    public static void Main() {
        ClaseA obj = new ClaseB();
        obj.Metodo();
    }
}

Posibles salidas:

a) A B A.Metodo

b) A B B.Metodo

c) B A A.Metodo

d) B A B.Metodo

Explicación: La salida es "A B A.Metodo" porque se oculta el método en la clase derivada, pero se invoca la versión de la clase base.

9. Respecto al siguiente código en C#, seleccione la afirmación correcta:

public abstract class Animal{
    public abstract void Comer();
    public void Dormir(){
        // Implementación omitida
    }
}

a) El código es correcot.

b) El código tiene errores porque la clase contiene métodos no abstractos.

c) El código tiene errores porque los métodos no tienen implementación.

d) Mediante "Animal animal = new Animal();" se puede crear una instancia de Animal.

Explicación: El código es correcto; las clases abstractas pueden tener métodos concretos y no son instanciables directamente.

10. En C#, sobre herencia e interfcaes, la afirmación correcta es:

a) C# permite implementar múltiples interfaces y herencia múltiple.

b) C# permite implementar múltiples interfaces, pero no herencia múltiple.

c) C# no permite implementar múltiples interfaces, pero sí herencia múltiple.

d) C# no permite ni implementar múltiples interfaces ni herencia múltiple.

Explicación: C# soporta implementación de múltiples interfaces, pero no herencia múltiple de clases.

11. Dado el siguiente código con salida "el tigre come animales", complete los espacios en blanco 1 y 2:

public class Animal{
    public __espacio1__ void Comer(){
        Console.WriteLine("Voy a comer");
    }
}
public class Tigre : Animal{
    public __espacio2__ void Comer(){
        Console.WriteLine("el tigre come animales");
    }
}
public class Prueba{
    static void Main(){
        Animal animal = new Tigre();
        animal.Comer();
    }
}

Opciones:

a) Virtual, new

b) override, virtual

c) virtual, override

d) new, virtual

Explicación: La combinación correcta es "virtual" para el primer espacio y "override" para el segundo, permitiendo la sobrescritura.

12. Evalúe el siguiente código y determine su comportamiento:

public abstract class Mascota{
    public abstract void Alimentar();
}
public class Felino : Mascota{
    public override void Alimentar(){
        Console.WriteLine("El felino come carne");
    }
}
public class Gato : Felino{
    static void Main(){
        Gato gato = new Gato();
        gato.Alimentar();
    }
}

Opciones:

a) El código es correcto, pero no produce salida.

b) El código es correcto y la salida es "El felino come carne".

c) El código tiene errores porque la clase Gato no implementa el método abstracto de Mascota.

d) El código tiene errores porque el método Alimentar de Mascota no está implementado.

Explicación: El código es correcto; Gato hereda de Felino, que implementa el método, y la salida es "El felino come carne".

13. En C#, ¿qué palabra clave se utiliza para sobrescribir métodos virtuales de la clase base?

a) override

b) new

c) base

d) virtual

Explicación: "override" se usa para sobrescribir métodos virtuales o abstractos.

14. ¿Cuál es el resultado de la ejecución de este código?

public class Estudiante{
    public virtual void Examen(){
        Console.WriteLine("Todos los estudiantes deben examinarse");
    }
}
public class Universitario : Estudiante{
    public new void Examen(){
        base.Examen();
        Console.WriteLine("Los universitarios eligen materias");
    }
}
public class Ejecucion{
    static void Main(){
        Estudiante est = new Universitario();
        est.Examen();
    }
}

Posibles salidas:

a) Todos los estudiantes deben examinarse

b) Los universitarios eligen materias

c) Todos los estudiantes deben examinarse

Los universitarios eligen materias

d) Todos los estudiantes deben examinarse

Todos los estudiantes deben examinarse

Explicación: La salida es "Todos los estudiantes deben examinarse" porque se oculta el método y se invoca la versión base, pero solo se muestra la salida de base.Examen().

15. Un programador definió una interfaz "IBaseDatos" y una clase "ClaseBaseDatos" que la implementa. Analice el código:

public interface IBaseDatos{
    void AbrirTabla(string nombreTabla);
    void ActualizarTabla(string nombreTabla);
}
public class ClaseBaseDatos : IBaseDatos{
    public void AbrirTabla(string nombreTabla){
        Console.WriteLine("Tabla abierta");
    }
    public void ActualizarTabla(string nombreTabla){
        Console.WriteLine("Tabla actualizada");
    }
    static void Main(){
        ClaseBaseDatos db = new ClaseBaseDatos();
        db.AbrirTabla("Clientes");
    }
}

Seleccione la afirmación correcta:

a) El código tiene errores porque los métodos de la interfaz no tienen implementación en su definición.

b) El código tiene errores porque los métodos de la interfaz no son públicos, por lo que no se pueden acceder en ClaseBaseDatos.

c) El código es correcto; además, como no se llama a ActualizarTabla, se puede eliminar de ClaseBaseDatos sin errores.

d) El código es correcto, pero si se declara un método adicional "void Ejecutar(string sql);" en IBaseDatos, debe implementarse en ClaseBaseDatos.

Explicación: La afirmación d es correcta; al añadir métodos a la interfaz, todas las clases implementadoras deben proporcionar su implementación.

Etiquetas: C# POO herencia interfaces clases abstractas

Publicado el 6-27 01:24