Herança e Polimofismo

Boa noite Pessoal estou precisando muito da ajuda de vocês.

Não estou conseguindo (sabendo) como criar uma instancia de uma classe.

Tenho uma espécie de Simulador de Processador onde na seguinte Class Principal, leio um arquivo TXT e faço um Split para separa os comandos e valores/registradores ex.:
ADD 5,0
SUB 1,0

public class Processador{
private int pc = 0;
private int registrador[] = new int[4];
private String temp[] = new String[4];
private String s[] = new String[500];
public void main (String[] args0) throws IOException{
try{
String entr = “c:\fatorial.txt”;
FileReader Fr = new FileReader(entr);
BufferedReader Br = new BufferedReader(Fr);
String linha = Br.readLine();
int aux = 0;
while(linha != null){
incrementaPC();
temp = linha.split("[ ,]");
for(int a=0; a < temp.length; a++){
s[aux++] = temp[a];
}
linha = Br.readLine();
}
}catch(FileNotFoundException e){

}
executar();
}

public void atualizaPC (int pos){ }
public void incrementaPC(){ pc++; }
public int getReg(int r){ return 0;/registradores;/ }
public void setReg(int r, int v){ registrador[r] = v; }

public void executar(){
for(int a = 0; a < s.length; a++){

if (s[a].equals(“STR”)){
//System.out.print(".STR\n");
//Instrucao; }

}
}

}

Tenho também o seguinte:

public abstract class Instrucao{
public abstract void executar(Processador processador);
}

e várias subclasse, por exemplo;
public class Add extends Instrucao{
public void executar(Processador processador){
//processador.setReg(1, processador.getReg(0) + processador.getReg(1));
}

}

Não estou conseguindo, chamar estas subclasses que serão reponsáveis por exexutar uma operação, que foi identificada no Split da Class Processador, resumindo a Class processador identifica todos os comando contidos no arquivo, armazena tudo num array, e depois procura todos os valores no array qdo tiver uma instrução que verifico no seguinte laço:

if (s[a].equals(“ADD”)){
//Instrucao; }

eu devo chamar a class responsável por esta operação, onde a mesma
atulizará um array REGISTRADORES q está na Class Pocessador…

ME AJUDEM POR FAVOR

Olá

Use as tags ‘code’ para ajudar na visualização do seu código…

Processador p; 
// ......


if (s[a].equals("ADD")){
        new Add().executar(p); // ????
} else if (s[a].equals("SUB")){
        new Sub().executar(p); // ????
}

Não consegui entender se é algo desse tipo que você está procurando…
Poderia explicar o que exatamente você não consegue?

Oi! Seja bem-vindo ao GUJ.

Em primeiro lugar… Dá uma lida nesse tópico, seleciona a opção edit do seu código e siga as dicas ali descritas.

Além disso, não pode mensagens com os dizeres “URGENTE” “ME AJUDEM POR FAVOR” “PIEDADE DE UMA POBRE ALMA”, etc. Assuntos urgentes deixamos para hospitais, polícia, bombeiros e consultores pagos. hehehe :wink:

Pois bem, você cria instâncias de classe usando o operador New.

No seu caso:

Processador p = new Processador(); Instrucao soma = new Add(); add.executar(p);

Note com isso que através do polimorfismo você poderia ter um vetor de instruções:

Processador p = new Processador();
//Carrega um grupo de instruções
Instrucao[] instrucoes = new Instrucao[4];
instrucoes[0] = new Add();
instrucoes[1] = new Sub();
instrucoes[2] = new Mov();
instrucoes[3] = new Xor();

//Executa todas elas
for (Instrucao instrucao : instrucoes) {
   instrucao.executar(p);
}

Desculpe por utilizar o URGENTE, não farei mais isso.

Senhores, consegui, utilizei uma mistura de suas idéias:
Processador p = new Processador();
new Str().executar§;

o que o restuldao final é o mesmo, correto?

Deh, é o seguinte, tenho que através da Class Processador, chamar a Subclasse de Instrução responsável por um instruão achada em Processador. Quando eu localizao no Array ‘s’ uma a palavra SUB por ex. tenho que chamar a Subclasse SUB da Classe Instrução, aí nesta Subclasse devo efetuar a operação.

Eu consigo fazer o seguinte:
Caso eu encontre a palavra SUB n aposição ‘0’ do array S na Class Processador, eu deverei chamar a SubClass SUB (já consegui com a dica de vocês), e estando na SubClass SUB devo pegar as posições 1 e 2 do array ‘S’ que esta na Class Proecssador e depois de alguma operação atualizá-los em uma posição x no array registradores que também está na Class Processador, é possível?

obrigado…

Senhores, acredito que esteja funcionando, porém ainda tenho um problema.

Na Class Processador, como já disse tenho um array Registrador, nele esta armazenado as instruções e os valores valores, sempre que acho uma instrução chamo as SubClass, da maneira que vocês me ajudaram, porém como faço para saber quando na estiver na Class Str qual é a posição da instrução?

Pois terei que pegar os dois ou as vezes tres valores nas posições subsequentes a posição da intrução e atualizar no registrador, onde o segundo valor depois da instrução (pos + 2) sempre será meu registrador.

public class Str extends Instrucao{
public void executar(Processador processador){
System.out.print("\nEXECUTANDO STR" + processador);
processador.setReg(pos, processador.getReg(pos + 1));
}
}

Obrigado.

Há formas melhores de modelar teu problema. Por ora, passe a posição por parâmetro para o método executar:

public class Str extends Instrucao{
    public void executar(Processador processador, int pos){
        System.out.print("\nEXECUTANDO STR" + processador);
        processador.setReg(pos, processador.getReg(pos + 1));
    }
}

E use as tags code do guj. Fica muito ruim de ler sem as tais.

Entendi, mas olha só, no meu caso na Class Processador eu tenho uma variável pc, que é obrigatório e poderei utilizá-la para saber em qual posição estou.

sendo assim criei o seguinte método, para retornar esta variável:

public int getPC(){ 
       return pc; 
}

porém quando estou na Class STR por exemploe que é a SubClass de Instrução, ao tentar acessá-la conforme abaixo:

public class Str extends Instrucao{
   public void executar(Processador processador){
       System.out.print("\nEXECUTANDO STR");  
       System.out.print(processador.getPC());
   }
}

O resultado é sempre igual a zero, coloquei este print apenas para testar se o resultado da variáel está correto.
O que pode estar ocasionando este erro???

Valeu

Entendi, mas olha só, no meu caso na Class Processador eu tenho uma variável pc, que é obrigatório e poderei utilizá-la para saber em qual posição estou.

sendo assim criei o seguinte método, para retornar esta variável:

public int getPC(){ 
       return pc; 
}

porém quando estou na Class STR por exemploe que é a SubClass de Instrução, ao tentar acessá-la conforme abaixo:

public class Str extends Instrucao{
   public void executar(Processador processador){
       System.out.print("\nEXECUTANDO STR");  
       System.out.print(processador.getPC()); //pega o valor de PC
   }
}

O resultado é sempre igual a zero, coloquei este print apenas para testar se o resultado da variáel está correto.
O que pode estar ocasionando este erro???

Valeu

Se você usa processador.getPC() no método executar do tipo Instrucao, esqueça minha dica de passar a posição por parâmetro.

Para sabermos o que houve com o getPC(), cole o teu código completo aqui (use a tag code!).

Senhores este é o código:

import java.io.*;
import javax.swing.*; 
import java.util.Vector;

public class Processador{
    private int pc = 0, instrucoes = 0;
    private int registrador[] = new int[4];
    private String temp[] = new String[4];
    private String s[][] = new String[50][50];
    
    public void main (String[] args0) throws IOException{     
        try{
            String entr = "c:\fatorial.txt";
            FileReader Fr = new FileReader(entr);
            BufferedReader Br = new BufferedReader(Fr);
            String linha = Br.readLine();
            while(linha != null){ 
                 temp = linha.split("[ ,]");
                 for(int a=0; a < temp.length; a++){
                      s[instrucoes][a] = temp[a];
                 }
                 instrucoes++;//testes
                 linha = Br.readLine();                 
                }
         }catch(FileNotFoundException e){
            //...      
         }
         System.out.print("\ninstrucoes: " + instrucoes);  
         executar();
         imprime();
    }
    
    public int getPC(){ return pc; }    
    public void atualizaPC (int pos){ }   
    public void incrementaPC(){  pc++;  }   
    public int getReg(int r){  return 0;/*registradores;*/  }
    public void setReg(int r, int v){ registrador[r] = v;  }
    
    public void executar(){              
        for(int a = 0; a < instrucoes; a++){             
           //if (s[a].equals(<outras instruções>)){
           //     Processador p = new Processador();
           //     new Lte().executar(p);
           //     }
            if (s[a][0].equals("STR")){
                Processador p = new Processador();
                System.out.print("\npc " + pc);  
                new Str().executar(p);
          }
           incrementaPC();
         }      
    }
    
    public void imprime(){ 
        for(int aux = 0; aux < 4; aux++){
            System.out.print("\nRegistrador " + aux + ": " + registrador[aux]); 
        System.out.print("\nPC " + pc);  
   }
}

Class instrução:

import javax.swing.*; 
    
public abstract class Instrucao{
    public abstract void executar(Processador processador);   
    public void executar(){
             System.out.print("\nEXECUTANDO INSTRUÇÕES INTRUÇÂO\n");  
    }
}

E uma SubClass de exemplo, pois todas são iguais, alterando apenas o tipo de operação a ser realizada:

public class Str extends Instrucao{
   public void executar(Processador processador){
       System.out.print("\nEXECUTANDO STR"); //apenas para verificação
       System.out.print(processador.getPC()) + " - " + processador.getReg(0) + processador.getReg(1));
   }
} 

:arrow: Teu main não deveria ser static?

:arrow: Aqui você está criando um novo objeto do tipo Processador (que inicializa-se com pc = 0) e passando como parâmetro. Muito natural que retorne 0 ao se chamar o getPC imediatamente após.

             if (s[a][0].equals("STR")){
                 Processador p = new Processador();
                 System.out.print("\npc " + pc);  
                 new Str().executar(p);
           }

Senhores, já consegui terminar meu códogo. Agora vejo os vacilos que dei, mas é isso programando e aprendendo hehehe…

Obrigado pela ajuda…

Alexandro

Isso mesmo, a main deve ser Static, depois que coloquei a Main como static e instanciei um objeto para a classe processador, consegui evoluir no código… com isso acabei de finalizar…

Obrigado!

Alexandro

Alexandro, vc ainda tem o código inteiro desta aplicação?

Estou precisando urgentemente para compreender determinados métodos; subclasses…

Agradeço muito se puder ajudar…até…