Difference between revisions of "Polimorfismo, Interfaces, Classes Abstractas/Exercício 03: Carros e Motores"

From Wiki**3

< Polimorfismo, Interfaces, Classes Abstractas
(Created page with "{{TOCright}} = Problema = Modele e implemente o seguinte problema (incluindo um método “main” ilustrativo da funcionalidade). Uma fábrica constrói vários tipos de carro:...")
 
(Conceito de Carro de Gama Média)
 
(35 intermediate revisions by the same user not shown)
Line 8: Line 8:
 
== UML: Diagrama de Classes ==
 
== UML: Diagrama de Classes ==
  
[[Image:PO-cars-engines.png]]
+
{{CollapsedCode|Diagrama de classes|
 +
[[Image:PO-cars-engines.png|600px]]
 +
}}
  
 
== Conceito de Carro (Gama Básica) ==
 
== Conceito de Carro (Gama Básica) ==
  
<java5>
+
{{CollapsedCode|Ficheiro '''Car.java'''|
</java5>
+
<source lang="java">
 +
public class Car {
 +
 
 +
  private Engine _engine;
 +
 
 +
  public Car() {
 +
    _engine = new Engine();
 +
  }
 +
 
 +
  public void go() {
 +
    _engine.on();
 +
  }
 +
 
 +
  public void stop() {
 +
    _engine.off();
 +
  }
 +
 
 +
  public Engine getEngine() {
 +
    return _engine;
 +
  }
 +
 
 +
  protected void setEngine(Engine engine) {
 +
    _engine = engine;
 +
  }
 +
 
 +
}
 +
</source>
 +
}}
  
 
== Conceito de Carro de Gama Média ==
 
== Conceito de Carro de Gama Média ==
  
<java5>
+
{{CollapsedCode|Ficheiro '''CarMidrange.java'''|
</java5>
+
<source lang="java">
 +
public class CarMidrange extends Car {
 +
 
 +
  public void updateEngine(BasicEngine engine) {
 +
    setEngine(engine);
 +
  }
 +
 +
}
 +
</source>
 +
}}
  
 
== Selecção de Carro de Topo de Gama  ==
 
== Selecção de Carro de Topo de Gama  ==
  
<java5>
+
{{CollapsedCode|Ficheiro '''CarTop.java'''|
</java5>
+
<source lang="java">
 +
public class CarTop extends CarMidrange {
 +
 +
  private Xtreme _xtra;
 +
 +
  @Override
 +
  public void go() {
 +
    super.go();
 +
    if (_xtra != null) _xtra.on();
 +
  }
 +
 +
  @Override
 +
  public void stop() {
 +
    super.stop();
 +
    if (_xtra != null) _xtra.off();
 +
  }
 +
 +
  public void addXtra(Xtreme engine) {
 +
    _xtra = engine;
 +
  }
 +
 +
}
 +
</source>
 +
}}
 +
 
 +
== Conceito de Motor ==
 +
 
 +
{{CollapsedCode|Ficheiro '''Engine.java'''|
 +
<source lang="java">
 +
public class Engine {
 +
 
 +
  public void on() { System.out.println("Engine ON!"); }
 +
 
 +
  public void off() { System.out.println("Engine OFF!"); }
 +
 
 +
}
 +
</source>
 +
}}
  
 
== Conceito de Motor (Gama Básica) ==
 
== Conceito de Motor (Gama Básica) ==
  
<java5>
+
{{CollapsedCode|Ficheiro '''BasicEngine.java'''|
</java5>
+
<source lang="java">
 +
public class BasicEngine extends Engine {
 +
 
 +
  @Override
 +
  public void on() { System.out.println("BasicEngine ON!"); }
 +
 
 +
  @Override
 +
  public void off() { System.out.println("BasicEngine OFF!"); }
 +
 
 +
}
 +
</source>
 +
}}
  
 
== Conceito de Motor Topo de Gama: Motor XTreme ==
 
== Conceito de Motor Topo de Gama: Motor XTreme ==
  
<java5>
+
{{CollapsedCode|Ficheiro '''Xtreme.java'''|
</java5>
+
<source lang="java">
 +
public class Xtreme extends Engine {
 +
 
 +
  @Override
 +
  public void on() { System.out.println("Xtreme ON!"); }
 +
 
 +
  @Override
 +
  public void off() { System.out.println("Xtreme OFF!"); }
 +
 
 +
}
 +
</source>
 +
}}
  
 
== Programa Principal ==
 
== Programa Principal ==
Line 39: Line 136:
 
O programa principal é como indicado no enunciado do problema e indicado abaixo por motivos de clarificação:
 
O programa principal é como indicado no enunciado do problema e indicado abaixo por motivos de clarificação:
  
<java5>
+
{{CollapsedCode|Ficheiro '''Application.java'''|
 +
<source lang="java">
 
/**
 
/**
 
  * Sample uses.
 
  * Sample uses.
 
  */
 
  */
 
public class Application {
 
public class Application {
 
+
  // TODO
 
}
 
}
</java5>
+
</source>
 +
}}
  
 
= Compiling and Running =
 
= Compiling and Running =
Line 55: Line 154:
  
 
   javac Car.java
 
   javac Car.java
   javac CarMidRange.java
+
   javac CarMidrange.java
   javac CarHighOctane.java
+
   javac CarTop.java
   javac Motor.java
+
   javac Engine.java
   javac XTreme.java
+
   javac BasicEngine.java
 +
  javac Xtreme.java
 
   javac Application.java
 
   javac Application.java
  
Line 70: Line 170:
 
[[category:Ensino]]
 
[[category:Ensino]]
 
[[category:PO]]
 
[[category:PO]]
 +
[[category:PO Exemplos]]

Latest revision as of 19:15, 29 October 2019

Problema

Modele e implemente o seguinte problema (incluindo um método “main” ilustrativo da funcionalidade). Uma fábrica constrói vários tipos de carro: o modelo básico, que não pode ser reconfigurado, mas que é barato; o modelo de gama média, um pouco mais caro, essencialmente um modelo básico que permite trocar com um simples comando o motor original por outro (motores de confiança da aclamada gama básica); e o modelo topo de gama, que além de permitir todas as operações do modelo de gama média, permite utilizar ainda qualquer um dos possantes motores da gama Xtreme. Assim, mantendo o motor básico, permite adicionar um novo motor, utilizando ambos os motores para maior desempenho. Do ponto de vista de cada carro, o tipo e número de motores não são importantes, já que todos fazem basicamente o mesmo: ligar (quando o carro precisa de andar) e desligar (quando o carro precisa de parar). Considere que os carros apenas disponibilizam os métodos de criação, configuração de motores e andar/parar. Considere que ambas as gamas de motores fornecem a funcionalidade ligar/desligar. Pode realizar outros métodos que julgue necessitar. Evite repetições de código.

Solução

UML: Diagrama de Classes

Diagrama de classes

PO-cars-engines.png

Conceito de Carro (Gama Básica)

Ficheiro Car.java
public class Car {

  private Engine _engine;

  public Car() {
    _engine = new Engine();
  }

  public void go() {
    _engine.on();
  }

  public void stop() {
    _engine.off();
  }

  public Engine getEngine() {
    return _engine;
  }

  protected void setEngine(Engine engine) {
    _engine = engine;
  }

}

Conceito de Carro de Gama Média

Ficheiro CarMidrange.java
public class CarMidrange extends Car {
  
  public void updateEngine(BasicEngine engine) {
    setEngine(engine);
  }
 
}

Selecção de Carro de Topo de Gama

Ficheiro CarTop.java
public class CarTop extends CarMidrange {
 
  private Xtreme _xtra;
 
  @Override
  public void go() {
    super.go();
    if (_xtra != null) _xtra.on();
  }
 
  @Override
  public void stop() {
    super.stop();
    if (_xtra != null) _xtra.off();
  }
 
  public void addXtra(Xtreme engine) {
    _xtra = engine;
  }
 
}

Conceito de Motor

Ficheiro Engine.java
public class Engine {

  public void on() { System.out.println("Engine ON!"); }

  public void off() { System.out.println("Engine OFF!"); }

}

Conceito de Motor (Gama Básica)

Ficheiro BasicEngine.java
public class BasicEngine extends Engine {

  @Override
  public void on() { System.out.println("BasicEngine ON!"); }

  @Override
  public void off() { System.out.println("BasicEngine OFF!"); }

}

Conceito de Motor Topo de Gama: Motor XTreme

Ficheiro Xtreme.java
public class Xtreme extends Engine {

  @Override
  public void on() { System.out.println("Xtreme ON!"); }

  @Override
  public void off() { System.out.println("Xtreme OFF!"); }

}

Programa Principal

O programa principal é como indicado no enunciado do problema e indicado abaixo por motivos de clarificação:

Ficheiro Application.java
/**
 * Sample uses.
 */
public class Application {
  // TODO
}

Compiling and Running

How to Compile?

The compilation is as follows:

 javac Car.java
 javac CarMidrange.java
 javac CarTop.java
 javac Engine.java
 javac BasicEngine.java
 javac Xtreme.java
 javac Application.java

In fact, compiling Application.java would cause the rest of them be compiled as well (the Java compiler accounts for all explicit class dependencies).

Running

The program starts at a main function (in this case, contained in the Application class):

 java Application