Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - gatoher

Páginas: 1 2 [3] 4 5
41
Hola me gustaría saber si hay una forma de llamar a métodos que estén en un script JavaScript o Jquery desde un archivo PHP. O sea, despues de hacer una consulta a una bbdd desde PHP  recibiendo un resultado 'true/false' poder llamar a metodos en un script Jquery a parte para mostrar y esconder elementos.

42
   Hola Lorenzo, gracias por responder. Si eso ya lo vi. Lo que pasa que con Jquery aplico una clase para que uando se intenta enviar el formulario de un campo obligatorio aparezca un texto explicando el motivo. Si pongo required en el input text no me aparece mi clase .error.
  No se, al final lo que he hecho es comprobar que todos los $_POST son correctos con 'if' y ya esta. 

43
A ver, os cuento mi problemilla, tengo un formulario que tiene varios 'select' que se cargan con JSON. Todo funciona perfecto hasta que meto el formulario dentro de un método. Vamos, que cuando aprietas el boton de registrarse por ejemplo y se muestra el formulario pues entonces dejan de cargarse los 'selects'.

Si el formulario lo saco de la función y se carga con la pagina, claro ya es accesible desde el script de javaScript.

Pongo algo de código pero tengo claro que esto ocurre por que el JSON se carga con la página, y el formulario no se carga en el DOM hasta que no se pulsa el boton. ¿Como puedo solucionar esto?

   
Código: [Seleccionar]
echo'<section id="login_form" class="oculto login_form_tamanyo" >';
    echo'<h4>Introduzca sus datos</h4>';
    echo'<form name="logeo" action="index.php" method="POST" id="form_login">';
        echo'<fieldset>';
        echo'</fieldset>';
                echo'</form>';
        echo'</section>';


   El JSON no lo pongo por que como digo me funciona:

     
Código: [Seleccionar]
    window.onload=function(){
     //Esto es el select que se crea al pulsar el boton
     provincias = document.getElementById('provincia');
     

44
Estoy peleando por que quiero conseguir que un formulario no sea enviado si todos los campos obligatorios son rellenados. Ya tengo mis funciones en JQuery y PHP, pero cuando te dejas un campo obligatorio si, el formulario vuelve a cargarse y se marca el campo en blanco o no rellenado correctamente.

 Lo que ocurre que creo un objeto con los datos recibidos, y cada vez que se envia el formulario se instancia aun cuando no esten todos los campos obligatorios rellenados.

Para evitar esto tengo, antes de instanciar el objeto compruebo que no hay ningun null,¿ pero como compruebo si un campo es correcto por ejemplo una contraseña?

Osea, no habría una forma de evitar que el formulario se enviase. No sé si me explico.

45
   Hola Mastermind, gracias por responder.
   A ver, si tienes razón el usuario es de Apache, eso esta claro. Pero si un script de PHP tiene que crear, modificar archivos en el directorio web, osea un ejemplo:
   /var/www/html/site.com. Ese directorio es de root, por eso no puede escribir en él.
   Además también hago modificaciones con mi usuario, que no es root. Yo root lo gasto para poco.
   He visto esta solución:


       1- sudo usermod -a -G developer user1 (agregar cada usuario al grupo de desarrolladores)
       2-sudo chgrp -R developer /var/www/site.com/ para que los desarrolladores puedan trabajar allí
      3- sudo chmod -R 2774 /var/www/site.com/ por lo que sólo los desarrolladores pueden crear/editar archivos (otro/mundo puede Lee)
     4-sudo chgrp -R www-data /var/www/site.com/uploads para que pueda crear www-data (apache/nginx) ficheros.

     Osea, por lo que yo entiendo es, 'por que no lo entiendo todo':
    1-Crear un grupo de desarrollo y agregar ahí mi usuario no root.
    2-Poner como propietario del directorio al grupo de desarrollo.
    3-Poner permisos de escritura,lectura ejecución al usuario y grupo propietario y sólo lectura a otros.(aqui tego la duda de porque hay un 2 delante del 774 si es octal,¿no debería haber un 0, osea 0774)
    4- Crea dentro de /var/www/site.com un directorio 'uploads' para que el usuario de apache pueda crear archivos.

   Esta solución parece más elegante. Alguna opinión

46
   Hola a todos tengo un problema a la hora de crear directorios desde un script de PHP, estoy usando Ubuntu como servidor y como usuario PHP es www-data y grupo www-data.
Esto lo se por que lo he mirado con:
Código: [Seleccionar]
        $user = getenv('APACHE_RUN_USER');
        $group = getenv('APACHE_RUN_GROUP');
        echo exec('whoami');

   Una solución es crear un directorio dentro del proyecto con permisos 777, pero no me parece nada elegante. Que tendría que hacer, dar permisos de escritura en /var/www al usuario y grupo www-data, o ejecutar PHP con un usuario de permisos de escritura en /var/www.

47
   Hola Cesar, gracias otra vez.

48
   Tengo una duda.  La verdad no se por que pero no consigo que desde un script de php pueda abrir una url con fopen. He mirado la documentación y no parece muy complicado pero no consigo que funcione. Lo estoy probando desde windows.
   Lo hago asi:
   
Código: [Seleccionar]
   $web = fopen("http://www.google.com/","r");
     //Esto lo pongo por ver que devuelve
     var_dump($web);=> resource(3, stream)
   
   
   ¿Que puedo estar haciendo mal? Gracias

49
   Hola a todos, estoy explorando el como crear un constructor en PHP  que admita varios tipos de parametros y sin tener en cuenta el orden de ellos cuando son enviados para crear las propiedades.

   He visto soluciones de o bien con el método __clone o creando un método que segun el número de parámetros  recividos mandaba a un constructor o a otro.

Eso esta bien pero siempre no puedes alterar el orden de los parámetros y poniendo null si un parámetro intermedio no quieres darle valor.

   Yo he hecho esto que me parece una solución pero no me acaba de satisfacer del todo y a ver si alguién tiene otro modo de hacerlo.

Código: [Seleccionar]
<?php

/* 
    Created on : 20-mar-2016, 20:25:15
    Author     : carlos
*/
class Objeto{
    private 
$id;
    private 
$nombre;
    private 
$email;
    
/*
    function __construct($id, $nombre, $email) {
        $this->id = $id;
        $this->nombre = $nombre;
        $this->email = $email;
    }
  */
      
    
public function constructor($arrayPropiedades){
        foreach (
$arrayPropiedades as $key =>$value){
        if(
property_exists(__CLASS__$key)){
            
$this->$key $value;
        } else{
            echo 
"No existe el atributo $var";
        }
    }
    }
    
    public function 
__get($var){
        if(
property_exists(__CLASS__$var)){
            return 
$this->$var;
        } else {
            return  
null;
        }
    }
    
//clase    
}

//Esto es lo que no me gusta, 
//tener que instanciar un objeto vacío primero
// para poder acceder al método.
$obj = new Objeto(); 
$obj2 $obj->constructor(array('id' => 1,
               
'nombre' => 'carlos'));
//funciona
echo 'Id: '.$obj->id;
echo 
"Nombre: ".$obj->nombre;


   He intentado crear un método static para acceder a él mediante el nombre de la clase. Pero claro, entonces da error en el $this del método constructor().
   ¿Alguién tiene una solución mas #compiGoguy?

50
   Hola Cesar, gracias por responder. A ver, lo de validar como te he comentado ya lo tengo claro. Pero como tú muy bien dices:

Citar
tienes que realizar la validación dejando anulado el envío del formulario (esto se puede hacer con código JavaScript) y luego cuando se verifique la validación proceder al envío del formulario (que también se puede hacer con código JavaScript).

   Entonces, estoy igual. A ver cuando yo validaba tanto con Js o PHP siempre utilizaba el boton de enviar para que la validación se hiciera. Comprendo dejar el boton de enviar anulado hasta que Js lo valide,pero ¿como llamo entnoces a Js para que empiece la validación?

   Imaginemos un formulario con 4 campos, 1 de los campos no es obligatorio,
el resto tienen una etiqueta que pone que son obligatorios. Bien el usuario los rellena todos, ¿como llamo o en que evento llamo al script Js para comenzar la validación?

   He pensado que en el último campo obligatorio, en el evento onblur llame a los metodos de validación y si es correcto active el boton enviar.

   ¿Esta solución es correcta?
 

51
Hola a todos, tengo una duda que me esta dando vueltas por la cabeza y no consigo ver la luz. He buscado por internet y he visto soluciones pero no me queda claro. A ver, yo se validar formularios con PHP y Js. Pero no tengo claro como hacerlo con los dos, primero en Js y luego PHP.

   Un ejemplo que he visto en internet es un formulario simple con 4 campos y 3 obligatorios, y en el onblur validaba con jQuery, y luego al dar al boton enviar validaba el PHP.

   La parte de PHP esta clara, pero como hacer la validación de Js. Osea ¿cuando se llama al script de Js?. No se si me explico, a mi lo único que se me ha ocurrido es dejar el boton de enviar inactivo hasta que el Js lo valide. ¿Esa sería una buena solución?

   Si en lugar de hacer la validación en el onblur, se hiciera al dar al boton de enviar, se podría hacer la validación primero en Js y si es correcta llamar al script PHP desde el Js para que entonces lo valide el PHP.

   La verdad que me he trabado ahi, o se como hacerlo salvo como he comentado de dejar el boton de enviar inactivo.



52
Bueno, cual ha sido mi sorpresa que soy incapaz de generar un .jar de mi proyecto. Bueno hacerlo lo hago pero no me funciona. He probado de varias formas y nada. El proyecto es sencillo y me funciona perfectamente en netbeans pero el .jar nada no hay forma.

El proyecto lleva jars dentro del proyecto y apuntan directamente a un package que cree para que estuvieran siempre accesibles.

¿Que puedo estar haciendo mal?

53
Hola Orgramar, a ver he estado intentandolo y nada. He visto librerias como pdfRenderer que las puedes descargar y funcionan. Lo que estoy tratando de hacer es crear una etiqueta en pdf y una vez creada "objetivo conseguido" que se imprima.

54
Os pongo una imagen de la estructura del proyecto y veis donde he añadido el .jar:


55
Hola a todos, tengo un problema en un script en JAVA. Estoy buscando la forma de imprimir un documento PDF que ya existe en mi pc. Lo estoy intentando hacer con el jar pdfbox pero tengo problemas con los import. Cuando añado el .jar hay unas clases que me dice NetBeans:

   
Citar
package org.apache.pdfbox.pdmodel does not exist

Os pongo el codigo para que veais como lo tengo:

Código: [Seleccionar]
package pdf;

import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.PrinterName;

//IMPORT QUE ME DA ESE ERROR
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.exceptions.COSVisitorException;
 

/**
 *
 * @author carlos
 */
public class Imprimir {
   
    private PrinterJob printerJob;
    private PrintService printService;

    public void print(String filePath, String printerName) throws URISyntaxException, IOException, PrinterException{
        //Buscar una impresora por su nombre dentro de los servicios de impresión
        //disponibles PrintServiceAttributeSet
        System.out.print("El nombre de la impresora es: "+printerName);
        System.out.print("La ruta al archivo es: "+filePath);
        PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet();
        printServiceAttributeSet.add(new PrinterName(printerName, null));
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, printServiceAttributeSet);
        //Guardar el servicio en un atributo de la clase
        this.printService = printServices[0];
        //Iniciar un nuevo trabajo de impresión
        this.printerJob = PrinterJob.getPrinterJob();
        //Intentar definirle el servicio de impresión asignado en el atributo de la clase previamente
        try{
            printerJob.setPrintService(this.printService);
         }catch(PrinterException e){
             System.out.print("Error al definir el servicio");
             System.out.println(e.toString());
          } try {
         //Cargar el documento
         PDDocument pdDocument = PDDocument.load(new File(new URI(filePath)));
          //imprimir el documento
          pdDocument.silentPrint(this.printerJob);
          } catch (URISyntaxException ex) {
              //Logger.getLogger(PDFBoxExample.class.getName()).log(Level.SEVERE, null, ex);
          }
   

       
    }       
       
   //clase     
}

  Aqui hay un enlace dnde explican como solucionarlo pero no llego a conseguirlo:
http://stackoverflow.com/questions/16504603/solved-java-imported-package-does-not-exist

  Cualquier ayuda se agradeceria.

56
Hola Mario, perdona por no responder antes. A ver, como me has respondido más o menos es asi como se trabaja. He estado viendo con Dongo el hacer un método generico, que reciva el array y luego con instanceof filtrar los objetos, "practicamente sería lo mismo que lo que yo he estado haciendo", por que dentro del método tienes que seguir filtrando por tipo de objeto.

Lo único, como tú comentas es sobreescribir los métodos implementados en la clase abstracta. Pero a mi me parece muy chocante tener que sobreescrivir métodos que no tienen nada que ver una clase con otra. Por ejemplo devolver el tamaño de la pantalla, o su peso son propiedades que si tiene un portatil y no un PC de sobremesa, o número de cds que tiene un PC de sobremesa y que no tiene un portatil, etc, etc.

Osea que llenar la clase abstracta o principal de todos los métodos no me termina de convencer. En mi clase hubo gente que en lugar de tener un único array de Computadoras hizo dos arrays "de computadoras" pero uno para portatiles otro para sobremesa. Pero tampoco me convence.

Como estoy viendo no hay una solución facíl.

57
Ok Mario, te pongo un ejercicio que hice en el modulo, sobre Computadoras. Hay una lista de Computadoras en la que metemos Portatiles  Sobremesa. Podemos ingresar, sacar y mostrar el contenido de ella. Para ingresar y sacar no hay problema, lo que va al asunto es cuando quiero mostrar los elementos de la lista con todos sus atributos.

Empiezo por la clase Computadoras;

Código: [Seleccionar]
public abstract class Computadoras {

    protected String numSerie;
    protected  String marca;
    protected String modelo;
    protected  String micro;
    protected int memoria;
    protected boolean dvd;
   
   
    //Constructor
    public Computadoras(String numSerie, String marca, String modelo, String micro, int memoria, boolean dvd) {
        this.numSerie = numSerie;
        this.marca = marca;
        this.modelo = modelo;
        this.micro = micro;
        this.memoria = memoria;
        this.dvd = dvd;
    }
   
   
    //metodo abstracto
    abstract String muestra();
     
   
  //get y set
    public String getNumSerie() {
        return numSerie;
    }

    public void setNumSerie(String numSerie) {
        this.numSerie = numSerie;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public String getMicro() {
        return micro;
    }

    public void setMicro(String micro) {
        this.micro = micro;
    }

    public int getMemoria() {
        return memoria;
    }

    public void setMemoria(int memoria) {
        this.memoria = memoria;
    }

    public boolean getDvd() {
        return dvd;
    }

    public void setDvd(boolean dvd) {
        this.dvd = dvd;
    }
   
     

    @Override
    public String toString() {
        return "El número de serie es " + numSerie + "\n" +
               " su marca es; " + marca + "\n" +
               " su modelo es; " + modelo + "." + "\n" +
               "Tiene el modelom de microprocesador; " + micro + "," + "\n"+
               " y, " + dvd + " tiene lector dvd.";
               
    }


Ahora te pongo si quieres la clase donde hice la lista. La lista esta en una clase distinta;

Código: [Seleccionar]
public class ListasComputadoras {

    private ArrayList<Computadoras> computadoras;
    private int activo = -1;
   
    //constructor
    public ListasComputadoras(){
      this.computadoras =  new ArrayList();
     
    }
    //metodo limpiar lista
    public void limpiar(){   
        // asiganmos null
        this.setComputadoras(null);
      }
     
    //Metodo insertar
    public void insertar(Computadoras obj){   
        this.getComputadoras().add(obj);
     
     
    }
   
    //Metodo borrar
   
    public boolean borrar (Computadoras obj){
     return getComputadoras().remove(obj);
     
   
     
    }
   
    //Metodo buscar
    public boolean buscar (Computadoras obj){
    boolean test = false;
   
    if(this.getComputadoras().contains(obj))
    {
        test = true; 
    } 
   
    return test;
  }
 
  //Busca y devuelve un ordenador
  public Computadoras devuelOrdenador (String numero){
     
   Computadoras tempOrd, obj = null;
        boolean encontrado = false;
       
        Iterator it = this.getComputadoras().iterator();
        while (it.hasNext() && encontrado == false) {  //Para cortar el bucle
            tempOrd = (Computadoras) it.next();
           
            if (obj.getNumSerie().equalsIgnoreCase(numero)) {
                obj= tempOrd;
                encontrado = true;
            }
        }
        return obj;
    }
 
 
     //Metodo muestra 
 public void muestra(){
     Computadoras obj;
     Iterator itr = getComputadoras().iterator();
     while(itr.hasNext()){
         obj = (Computadoras)itr.next();
         obj.muestra();
         System.out.println("**************");
                   
     }
     
 }
 
 //Comprobamos que al menos hay 1 elemento
 public boolean AlgunElemento(){
    boolean algunElemento = false;
   
    if ( computadoras.size()>0){
        System.out.println (computadoras.size());
        algunElemento = true;
    }
    return algunElemento;
   
     
 }
 
 //Inicio Lista
 public boolean inicioLista(){
     
     boolean inicioLista = false;
     if (activo == 0){
         inicioLista = true;
     }
     
     return inicioLista;
 }
 //Comprobamos que estamos en el ultimo elemento
 public boolean finalLista (){
     boolean finalLista = false;
     
     if (activo == computadoras.size()){
         finalLista= true;
     }
     return finalLista;
 }
 
 
 //Comprobamos que hay almenos dos elementos para
 // dejar los botones de primero y ir a la derecha Enables
 public boolean botonesInferiores(){
  boolean inferior=  false;
 
     if (activo >= 0 ){
       inferior = true; 
     }
     
    return inferior;   
 }
 
 //Comprobamos que aun quedan por lo menos dos elementos
 // para dejear Enable el boton de ir a la izquierda
 public boolean botonesSuperiores(){
 boolean superior = false;
       
         if (activo < computadoras.size()){
             superior = true;           
         }
         
    return superior;
 }
 
 //Comprobamos que hay elementos en la lista
 //para la funcion limpiar
 public boolean elementosLista(){
    boolean elementosLista = false;
    int num = 0;
   
    num = computadoras.size();
    if (num>0){
        elementosLista= true;
       
    }
   return elementosLista;
     
 }
//clase   

    /**
     * @return the computadoras
     */
    public ArrayList<Computadoras> getComputadoras() {
        return computadoras;
    }

    /**
     * @param computadoras the computadoras to set
     */
    public void setComputadoras(ArrayList<Computadoras> computadoras) {
        this.computadoras = computadoras;
    }

    public int getActivo() {
        return activo;
    }

    public void setActivo(int activo) {
        this.activo = activo;
    }
   
   
   
}


Ahora te pongo la clase por ejemplo Sobremesa que extiende Computadoras;

Código: [Seleccionar]
public class SobreMesa extends Computadoras{
 
    private int numUsb;
    private boolean tSonido;
    private int tamanio;

    //Constructor
    public SobreMesa( String numSerie, String marca, String modelo, String micro, int memoria, boolean dvd, int numUsb, boolean tSonido, int tamanio) {
        super(numSerie, marca, modelo, micro, memoria, dvd);
        this.numUsb = numUsb;
        this.tSonido = tSonido;
        this.tamanio = tamanio;
    }

    //get y setters
    public int getNumUsb() {
        return numUsb;
    }

    public void setNumUsb(int numUsb) {
        this.numUsb = numUsb;
    }

    public boolean istSonido() {
        return tSonido;
    }

    public void settSonido(boolean tSonido) {
        this.tSonido = tSonido;
    }

    public int getTamanio() {
        return tamanio;
    }

    public void setTamanio(int tamanio) {
        this.tamanio = tamanio;
    }
   
   
    public void lee (){
       
    int numUsb;
    boolean tSonido;
    float tamanio;   
     
    numUsb = Integer.parseInt(Lector.leer(" Dime el numero de usb que tiene el ordenador"));
    tSonido = Boolean.parseBoolean(Lector.leer("Dime si tiene tarjeta de sonido \"true\" o no \"false\" "));
    tamanio = Float.parseFloat(Lector.leer("Dime el tamanio que tiene el monitor"));   
       
    }
   
   
   
   
    //metodo sobreescrito
   
    @Override
    String muestra() {
       return super.toString() +
               " Tiene " + numUsb + " USB, " + "\n" +
               " y " + tSonido + " tiene tarjeta sonido." + "\n" +
               "Su tamañio es; " + tamanio+ ".";
    }
   
    }


Vamos a la question, yo tengo un JFrame con botones que puedo ir hacía delante y atrás y se van mostrando los datos según, los comunes a Sobremesa y Portatiles, esos son fijos "cada modelo tiene los suyos claro" y luego los de cada clase segun portatíles o sobremesa.

Te pongo un método por que la clase es muy larga pero se ve claro a donde he tenido que ir. Fijate en las líneas que tienen comentario.

Código: [Seleccionar]

    private void b1derechaActionPerformed(java.awt.event.ActionEvent evt) {                                         
     
        //Cada vez que pulsamos el boton sumamos 1 a activo
        mostrar.setActivo(mostrar.getActivo()+1);
         Computadoras obj;
             
         if (!mostrar.finalLista()){   //Si no estamos en el último indice de la lista
             
          obj = (Computadoras)mostrar.getComputadoras().get(mostrar.getActivo());
         
          if (obj instanceof SobreMesa){
              label1.setText(obj.numSerie);
              label2.setText(obj.getMarca());
              label3.setText(obj.getModelo());
              label4.setText(obj.getMicro());
              String memoria = String.valueOf(obj.getMemoria());
              label5.setText(memoria);
              if (((SobreMesa)obj).getDvd()){  //Propiedad de objeto sobremesa inalcanzable para objeto Computadora
                  label6.setText("Si.");
              }else{
                  label6.setText("No.");
              }
              String usb=String.valueOf((((SobreMesa)obj).getNumUsb()));  //Propiedad de objeto sobremesa inalcanzable para objeto Computadora
              label7.setText(usb);
              if (((SobreMesa)obj).istSonido()){
              label8.setText("Si.");
          }else {
              label8.setText("No.");
         
          }
             String tamaño = String.valueOf(((SobreMesa)obj).getTamanio());  //Propiedad de objeto sobremesa inalcanzable para objeto Computadora
             label10.setText(tamaño);
             
          }
         
          if (obj instanceof Portatiles){
              label30.setText(obj.numSerie);
              label31.setText(obj.getMarca());
              label32.setText(obj.getModelo());
              label33.setText(obj.getMicro());
              String memoria = String.valueOf(obj.getMemoria());
              label34.setText(memoria);
              if (((Portatiles)obj).getDvd()){
                  label35.setText("Si.");
              }else{
                  label35.setText("No.");
              }
              String peso = String.valueOf(((Portatiles)obj).getPeso()); //Propiedad de objeto Portatiles inalcanzable para objeto Computadora
              label36.setText(peso);
              String pulgadas =  String.valueOf(((Portatiles)obj).getPulgadas()); //Propiedad de objeto Portatiles inalcanzable para objeto Computadora
              label37.setText(pulgadas);
          }
     
         } else{
             b1derecha.setEnabled(false);
             JOptionPane.showMessageDialog(this, "No hay más elementos a mostrar");
           
         }
         
         //Al pulsar la primera vez el boton de ir al siguiente objeto
         //Se activan los botones de retroceder y ir final.
         //Comprobamos que activo es mayor de 0
         if (mostrar.botonesInferiores()){
              b1final.setEnabled(true);
              b1izq.setEnabled(true);
      }
     
     
    }


Si tienes una solución estaría encantado que me lo dijeras por que cada vez que hago un array y tengo que separar cada tipo de objeto del array, se me cae el mundo encima.
Si haces un array que tiene 5 o 6 tipos de objetos para mostrar sus datos .... :o

Los métodos no hay problema si estan en la clase abtracta y los sobreescribes, pero si tienes un método propio, en este caso imagina Sobremesa que te devuelve (xxxxx), a no ser que haga el molde tampoco puedo acceder a ello.

De todas formas llevo poco tiempo con Java, posiblemente sea también problema de diseño  :-X


58
Hola Mario, a ver yo cuando digo que un supertipo no puede acceder a los métodos o propiedades me refiero sin hacer casting o sobreescritura. Ejemplo;

//Clase persona
int dni;

//Clase Hombre
String nombre;

Persona p1 = new Persona();
p1= new Hombre();

p1.getNombre(); /// Error

String nombre = (Hombre)p1.getNombre(); //Forma que yo conozco

Si yo hago un arrayList de Personas y meto Hombres y Mujeres en ella, y quiero sacar un atributo que solo tienen los hombres "no se entienda mal, las mujeres tienen muchos más", con un iterator, tengo ue recorer el arrayList y luego con instanceof separar los hombre de las mujeres, y aun asi, sabiendo que es un hombre, tengo que hacer el casting.

59
Hola Mario, la verdad que la explicación esta bastante clara. Yo las pregunta que hay al final las he contestdo de esta manera;

A) No. Daría "ClassCastException", el compilador no sabe si la variable Vehiculo almacena un taxi o una ambulancia.

B)Si

E)El toString si esta sobre escrito

Un resumen que me he hecho yo es que un objeto "Hombre o Mujer" que herede de Persona, tiene además de las propiedades y metédos de su propia clase "Hombre o Mujer" las que hereda de Persona.
Pero un objeto Persona no puede recibir ni las propiedades ni los metédos de sus clases extendidas o "hijas", a no ser que un objeto declarado Persona he instanciado Mujer, tenga los metédos sobre escritos o hagas un "Molde".

Ejemplo;

 ((Mujer)Persona[0]).metodoMujer();

Corrigeme si estoy equivocado con esta reflexión  :o;

Ahora viendo esto, digo yo que en el Stack, que es donde se guarda las variables de referencia habría una variable Persona y una Mujer apuntando a un mismo objeto. Este Objeto si se declara como Persona tiene en el Head en un principio únicamente todos los metódos y propiedades de una Persona.

Si más tarde se le pasa una referencia de Mujer, ese objeto en memoria también tiene  los métodos y propiedades de Mujer. Pero no puede acceder a ellos facilmente. Hay sobreescribir los métodos y se hace un casting, esto es lo raro entre "".

Por que si tu creas un objeto directamente Mujer o Hombre, que extienden a Persona, en memoria se crea un objeto con los métodos y propiedades tanto de Hombre y Mujer como de Persona. Lo lógico. Pero si esa variable "tipo Mujer" la metes en un objeto tipo Persona, deja de tener acceso a sus propiedades y métodos a no ser que ....

No se que sentido tiene el haberlo hecho asi.

60
Hola Mario, es un ejemplo de un libro y no hay más código. Tienes razón la verdad que se me olvido escribir "Asusamos que el listado xx es legal", esta en negrita  ;D. Es un ejemplo para explicar por que no puedes meter en una Lista<Object> una lista<String>.
Si se pudiera hacer esto, "una de las cosas para lo que los genéricos estan es para evitar esto" podría suceder el problema de asignar  a una variable un tipo de dato que no le corresponde.

String s = ls.get(0);

Pero viendo la entrega CU00689B me ha quedado más claro. La única duda que tengo es si la variable interino1 no se hubiera asignado a profesor73;

 Profesor profesor73 = interino1; //Ahora el supertipo contiene un subtipo, en principio con pérdida de información

¿interino1 no sería profesor?¿Estoy equivovado ahí.?

Páginas: 1 2 [3] 4 5

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".