none
Una Pregunta sobre clases Abstractas e Interfaces

    Question

  • Hola A todos Tengo una pregunta:

    Teniendo una clase abstracta Graphics asi

    abstract class Graphic
    {
            abstract public void draw();
            abstract public bool intersects(Point p);
            abstract public void insert(Graphic child);
            abstract public void remove(Graphic child);
    }
    y una clase concreta que hereda de esta clase Graphics asi:

    class Caracter:Graphic
    {
    }

    ¿Como puedo hacer que la clase Caracter herede solo algunos métodos de la clase abstracta
    y no todos? por ejemplo que herede solo el metodo Draw?

    Espero haberme hecho entender cualquier ayuda es bienvenida muchas gracias.
    Wednesday, July 11, 2007 7:40 PM

Answers

  • Hola Prince,

     

      Al definir una clase abstracta estás definiendo una clase base de la que no se pueden crear objetos.

      Al definir los métodos de esta clase como abstractos, como ya sabes estás obligando a la clase hija "Caracter" a implementar-los todos.

     

     Si lo que quieres es que "Caracter" solo tenga acceso al método "draw()" puedes hacer las siguientes acciones:

     

    • Definir los otros tres métodos como privados y no abstractos, de esta manera solo la clase "Graphic" podrá acceder y la clase "Caracter" no los verá.

    abstract class Graphic
    {
            abstract public void draw();
            private bool intersects(Point p){}
            private void insert(Graphic child){}
            private void remove(Graphic child){}
    }

    • Otra manera sería crearte una clase entremedia que sea la que filtre los métodos que no quieres mostrar, de esta forma tendrías una clase llamada "filtro" que sería algo del estilo:

    //Esta es tu clase padre, la misma que tienes.

    abstract class Graphic

    {

          abstract public bool draw();

          abstract public bool intersects(Point p);

          abstract public void insert(Graphic child);

          abstract public void remove(Graphic child);

    }

     

    //La clase filtro, al poner el token "sealed" le indicas que a partir de aquí nadie puede heredar dicho método

    abstract class filtro:Graphic{

    public override sealed void insert(Graphic child){

    throw new Exception("The method or operation is not implemented.");

    }

    public sealed override bool intersects(Point p)

    {

    throw new Exception("The method or operation is not implemented.");

    }

    public sealed override void remove(Graphic child)

    {

    throw new Exception("The method or operation is not implemented.");

    }

    }

     

    //La clase Caracter que hereda de filtro solo puede ver los métodos que ha heredado "filtro" que no son sealed

    class Caracter:filtro

    {

    public override bool draw()

    {

    /*Implementacion de draw() */

    }

    }

    Puede jugar bastante también con las interficies.

    Espero que te sirva.

    Saludos,

    http://www.cvcmac.com

     

    Wednesday, July 11, 2007 11:17 PM

All replies

  • Con herencia no vas a poder solucionar el escenario que planteas. Con una interfaz para cada método vas a poder crear una primera aproximación, pero bien, bien... no creo que se pueda hacer.

     

     

    Salud!

    Wednesday, July 11, 2007 8:14 PM
    Moderator
  • Hola Prince,

     

      Al definir una clase abstracta estás definiendo una clase base de la que no se pueden crear objetos.

      Al definir los métodos de esta clase como abstractos, como ya sabes estás obligando a la clase hija "Caracter" a implementar-los todos.

     

     Si lo que quieres es que "Caracter" solo tenga acceso al método "draw()" puedes hacer las siguientes acciones:

     

    • Definir los otros tres métodos como privados y no abstractos, de esta manera solo la clase "Graphic" podrá acceder y la clase "Caracter" no los verá.

    abstract class Graphic
    {
            abstract public void draw();
            private bool intersects(Point p){}
            private void insert(Graphic child){}
            private void remove(Graphic child){}
    }

    • Otra manera sería crearte una clase entremedia que sea la que filtre los métodos que no quieres mostrar, de esta forma tendrías una clase llamada "filtro" que sería algo del estilo:

    //Esta es tu clase padre, la misma que tienes.

    abstract class Graphic

    {

          abstract public bool draw();

          abstract public bool intersects(Point p);

          abstract public void insert(Graphic child);

          abstract public void remove(Graphic child);

    }

     

    //La clase filtro, al poner el token "sealed" le indicas que a partir de aquí nadie puede heredar dicho método

    abstract class filtro:Graphic{

    public override sealed void insert(Graphic child){

    throw new Exception("The method or operation is not implemented.");

    }

    public sealed override bool intersects(Point p)

    {

    throw new Exception("The method or operation is not implemented.");

    }

    public sealed override void remove(Graphic child)

    {

    throw new Exception("The method or operation is not implemented.");

    }

    }

     

    //La clase Caracter que hereda de filtro solo puede ver los métodos que ha heredado "filtro" que no son sealed

    class Caracter:filtro

    {

    public override bool draw()

    {

    /*Implementacion de draw() */

    }

    }

    Puede jugar bastante también con las interficies.

    Espero que te sirva.

    Saludos,

    http://www.cvcmac.com

     

    Wednesday, July 11, 2007 11:17 PM
  • muchas gracias por sus respuestas no estoy seguro si funcione pero es muy valiosa la información

    la idea es implementar un patrón de diseño llamado composite en un editor de texto

    El patrón composite es una clase abstracta por ejemplo un objeto dibujable, este tiene los métodos:
    dibujar, insertar(un objeto dibujable hijo), remover, y intersecta(retorna si el objeto intersecta el punto dado).

    ahora la clases concretas son por ejemplo Carácter que hereda de dibujable pero este solo implementa dibujar ya que no puede tener hijos.

    y también otras clases concretas por ejemplo Palabra que implementa todos los métodos, porque una palabra si puede tener hijos dibujables, es decir una palabra se compone de caracteres así se le podrán insertar caracteres a la palabra..

    no se si me hice entender muchas gracias por la ayuda Saludos.....
    Sunday, July 15, 2007 8:03 PM