Difference between revisions of "Polimorfismo, Interfaces, Classes Abstractas/Exemplo com vários conceitos"

From Wiki**3

< Polimorfismo, Interfaces, Classes Abstractas
(Aplicação)
(XP2020)
 
(29 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
O seguinte exemplo ilustra a utilização de interfaces em Java. Note-se que, além das interfaces, são também utilizadas classes abstractas, por forma a contrastar a utilização de cada conceito. O diagrama UML fornece uma panorâmica do conjunto de interfaces e classes: a amarelo estão representadas as interfaces e a verde as classes abstractas; as classes normais estão a branco.
 
O seguinte exemplo ilustra a utilização de interfaces em Java. Note-se que, além das interfaces, são também utilizadas classes abstractas, por forma a contrastar a utilização de cada conceito. O diagrama UML fornece uma panorâmica do conjunto de interfaces e classes: a amarelo estão representadas as interfaces e a verde as classes abstractas; as classes normais estão a branco.
  
[[Image:po11.gif|center|Diagrama de classes para o exemplo descrito.]]
+
[[Image:po11.png|center|Diagrama de classes para o exemplo descrito.]]
  
 
O exemplo implementa vários conceitos, sendo os principais o de cão e o de vigilante. São definidos outros conceitos que especializam estes e outros que fornecem implementações concretas de cada um. Assim, o conceito de robot é o de um vigilante automático e o de cão de guarda um vigilante canino.
 
O exemplo implementa vários conceitos, sendo os principais o de cão e o de vigilante. São definidos outros conceitos que especializam estes e outros que fornecem implementações concretas de cada um. Assim, o conceito de robot é o de um vigilante automático e o de cão de guarda um vigilante canino.
  
São utilizadas as seguintes interfaces e classes:  <code>Cão</code>, <code>Vigilante</code>, <code>CãoDeGuarda</code>, <code>CãoPastor</code>, <code>Chihuahua</code>, <code>Robot</code>, <code>XP</code>, <code>XP2003</code>.
+
São utilizadas as seguintes interfaces e classes:  '''Cão''', '''Vigilante''', '''CãoDeGuarda''', '''CãoPastor''', '''Chihuahua''', '''Robot''', '''XP''', '''XP2018'''.
  
 
==Cão==
 
==Cão==
  
A interface <code>Cão</code> define as assinaturas dos métodos a que qualquer classe que implemente um cão deve saber responder.
+
A interface '''Cão''' define as assinaturas dos métodos a que qualquer classe que implemente um cão deve saber responder.
  
  <tt><B>interface</B> C&atilde;o {</tt>
+
<source lang="java">
    <tt><FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ladrar</FONT>();</tt>
+
interface Cão {
    <tt><FONT COLOR="#800000">int</FONT> <FONT COLOR="#000080">nPatas</FONT>();</tt>
+
  void ladrar();
  <tt>}</tt>
+
  int  nPatas();
 +
}
 +
</source>
  
 
Embora nada seja expresso na interface, além da assinatura, assume-se que a semântica a associar a cada método é a seguinte:
 
Embora nada seja expresso na interface, além da assinatura, assume-se que a semântica a associar a cada método é a seguinte:
* <code>ladrar</code> - executa a acção de produzir um latido
+
* '''ladrar()''' - executa a acção de produzir um latido
* <code>nPatas</code> - calcula/retorna o número de patas do cão
+
* '''nPatas()''' - calcula/retorna o número de patas do cão
As classes que implementem a interface, embora não sejam obrigadas a implementar esta semântica, têm todo o interesse em fazê-lo.
+
As classes que implementem a interface, embora não sejam obrigadas a implementar esta semântica, têm todo o interesse em fazê-lo.
  
 
==Vigilante==
 
==Vigilante==
  
Por seu turno, a interface <code>Vigilante</code> define as assinaturas dos métodos a que uma entidade "vigilante" deve saber responder.
+
Por seu turno, a interface '''Vigilante''' define as assinaturas dos métodos a que uma entidade "vigilante" deve saber responder.
  
  <tt><B>interface</B> Vigilante {</tt>
+
<source lang="java">
    <tt><FONT COLOR="#800000">boolean</FONT> <FONT COLOR="#000080">háIntrusos</FONT>();</tt>
+
interface Vigilante {
    <tt><FONT COLOR="#800000">void</FONT>   <FONT COLOR="#000080">soarAlarme</FONT>();</tt>
+
  boolean háIntrusos();
  <tt>}</tt>
+
  void    soarAlarme();
 +
}
 +
</source>
  
 
A semântica a associar pelas implementações é a seguinte:
 
A semântica a associar pelas implementações é a seguinte:
* <code>háIntrusos</code> - retorna <code>[[Palavras chave da linguagem Java#true|true]]</code> se tiverem sido detectados intrusos
+
* '''háIntrusos()''' - retorna '''[[Palavras chave da linguagem Java#true|true]]''' se tiverem sido detectados intrusos
* <code>soarAlarme</code> - executa a acção de activar um alarme, e.g. um sinal sonoro
+
* '''soarAlarme()''' - executa a acção de activar um alarme, e.g. um sinal sonoro
  
 
==Robot==
 
==Robot==
  
A interface <code>Robot</code> é uma especialização de <code>Vigilante</code>: é um vigilante robotizado que sabe avisar e destruir intrusos.
+
A interface '''Robot''' é uma especialização de '''Vigilante''': é um vigilante robotizado que sabe avisar e destruir intrusos.
  
  <tt><B>interface</B> <FONT COLOR="#000000">Robot</FONT> <B>extends</B> Vigilante {</tt>
+
<source lang="java">
    <tt><FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">avisarIntrusos</FONT>();</tt>
+
interface Robot extends Vigilante {
    <tt><FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">destruirIntrusos</FONT>();</tt>
+
  void avisarIntrusos();
  <tt><B>}</B></tt>
+
  void destruirIntrusos();
 +
}
 +
</source>
  
As implementações da interface <code>Robot</code>, além do que já se disse para a interface <code>Vigilante</code>, devem fornecer a seguinte semântica por método:
+
As implementações da interface '''Robot''', além do que já se disse para a interface '''Vigilante''', devem fornecer a seguinte semântica por método:
* <code>avisarIntrusos</code> - deve ser emitido um aviso (possivelmente, porque depois se segue a invocação do método <code>destruirIntrusos</code> - mas não há qualquer garantia...)
+
* '''avisarIntrusos()''' -- deve ser emitido um aviso (possivelmente, porque depois se segue a invocação do método '''destruirIntrusos()''' -- mas não há qualquer garantia...)
* <code>destruirIntrusos</code> - a acção a executar corresponde à destruição dos intrusos
+
* '''destruirIntrusos()''' -- a acção a executar corresponde à destruição dos intrusos
  
 
==Cão de Guarda==
 
==Cão de Guarda==
  
A interface <code>CãoDeGuarda</code>, de modo análogo a <code>Robot</code> define a assinatura das implementações de um cão de guarda, i.e., um cão vigilante.
+
A interface '''CãoDeGuarda''', de modo análogo a '''Robot''' define a assinatura das implementações de um cão de guarda, i.e., um cão vigilante.
  
  <tt><B>interface</B> C&atilde;oDeGuarda <B>extends</B> C&atilde;o, Vigilante {</tt>
+
<source lang="java">
    <tt><FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">morder</FONT>();</tt>
+
interface CãoDeGuarda extends Cão, Vigilante {
  <tt>}</tt>
+
  void morder();
 +
}
 +
</source>
  
Note-se a utilização de herança múltipla.
+
Note-se a utilização de herança múltipla relativamente às interfaces.
  
 
==Cão Pastor==
 
==Cão Pastor==
  
A primeira classe deste exemplo é <code>CãoPastor</code>. Esta classe implementa parte da interface de um cão de guarda e deixa para as suas subclasses a especificidade associada ao método <code>ladrar</code>. Embora abstracta, esta classe é uma implementação (ainda que parcial) da interface.
+
A primeira classe deste exemplo é '''CãoPastor'''. Esta classe implementa parte da interface de um cão de guarda e deixa para as suas subclasses a especificidade associada ao método '''ladrar()'''. Embora abstracta, esta classe é uma implementação (ainda que parcial) da interface.
  
  <tt><B>public</B> <B>abstract</B> <B>class</B> C&atilde;oPastor <B>implements</B> C&atilde;oDeGuarda {</tt>
+
<source lang="java">
    <tt><B>public</B> <FONT COLOR="#800000">final</FONT> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">int</FONT> N_PATAS = <FONT COLOR="#0000ff">4</FONT>;</tt>
+
public abstract class CãoPastor implements CãoDeGuarda {
 
+
  public final static int N_PATAS = 4;
    <tt><I><FONT COLOR="#808080">// m&eacute;todos privados</FONT></I></tt>
+
    <tt><B>private</B> <FONT COLOR="#800000">void</FONT>   <FONT COLOR="#000080">fecharBoca</FONT>()  { <I><FONT COLOR="#808080">/* qualquer coisa */</FONT></I> }</tt>
+
  // métodos privados
    <tt><B>private</B> <FONT COLOR="#800000">boolean</FONT> <FONT COLOR="#000080">h&aacute;Predadores</FONT>() {</tt>
+
  private void    fecharBoca()  { /* qualquer coisa */ }
      <tt><I><FONT COLOR="#808080">/* qualquer coisa */</FONT></I></tt>
+
  private boolean háPredadores() {
      <tt><B>return</B> <B>true</B>;</tt>
+
    /* qualquer coisa */
    <tt>}</tt>
+
    return true;
 
+
  }
    <tt><I><FONT COLOR="#808080">// interface C&atilde;oDeGuarda</FONT></I></tt>
+
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">morder</FONT>() { <FONT COLOR="#000080">fecharBoca</FONT>(); }</tt>
+
  // interface CãoDeGuarda
 
+
  public void morder() { fecharBoca(); }
    <tt><I><FONT COLOR="#808080">// inteface C&atilde;o</FONT></I></tt>
+
    <tt><B>public</B> <FONT COLOR="#800000">int</FONT> <FONT COLOR="#000080">nPatas</FONT>() { <B>return</B> N_PATAS; }</tt>
+
  // inteface Cão
    <tt><B>public</B> <B>abstract</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ladrar</FONT>();</tt>
+
  public int  nPatas() { return N_PATAS; }
 
+
  public abstract void ladrar();
    <tt><I><FONT COLOR="#808080">// interface Vigilante</FONT></I></tt>
+
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT>   <FONT COLOR="#000080">soarAlarme</FONT>() { <FONT COLOR="#000080">ladrar</FONT>(); }</tt>
+
  // interface Vigilante
    <tt><B>public</B> <FONT COLOR="#800000">boolean</FONT> <FONT COLOR="#000080">h&aacute;Intrusos</FONT>() { <B>return</B> <FONT COLOR="#000080">h&aacute;Predadores</FONT>(); }</tt>
+
  public void    soarAlarme() { ladrar(); }
  <tt>}</tt>
+
  public boolean háIntrusos() { return háPredadores(); }
 +
}
 +
</source>
  
 
==Chihuahua==
 
==Chihuahua==
  
Um exemplo de uma classe (não abstracta, i.e., implementa <code>ladrar</code>) derivada de <code>CãoDeGuarda</code> é a que se segue. Esta classe apenas necessita de implementar o método <code>ladrar</code> para ficar completa.
+
Um exemplo de uma classe (não abstracta, i.e., implementa '''ladrar()''') derivada de '''CãoDeGuarda''' é a que se segue. Esta classe apenas necessita de implementar o método '''ladrar()''' para ficar completa.
  
  <tt><B>public</B> <B>class</B> Chihuahua <B>extends</B> C&atilde;oPastor {</tt>
+
<source lang="java">
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ladrar</FONT>() { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;guau, guau&quot;</FONT>); }</tt>
+
public class Chihuahua extends CãoPastor {
  <tt>}</tt>
+
  public void ladrar() { System.out.println("guau, guau"); }
 +
}
 +
</source>
  
 
==XP==
 
==XP==
  
Supõe-se que a classe <code>XP</code> existe independentemente das outras descritas até aqui (foi, por exemplo, definida para outro fim). Supõe-se, contudo, que contém funcionalidade útil para uma possível implementação de um robot, i.e., para uma classe que implemente a interface <code>Robot</code>.
+
Supõe-se que a classe '''XP''' existe independentemente das outras descritas até aqui (foi, por exemplo, definida para outro fim). Supõe-se, contudo, que contém funcionalidade útil para uma possível implementação de um robot, i.e., para uma classe que implemente a interface '''Robot'''.
  
  <tt><B>public</B> <B>class</B> XP {</tt>
+
<source lang="java">
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT>   <FONT COLOR="#000080">reboot</FONT>()    { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;See ya!&quot;</FONT>); }</tt>
+
public class XP {
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT>   <FONT COLOR="#000080">shutdown</FONT>()  { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Bye!&quot;</FONT>); }</tt>
+
  public void    reboot()    { System.out.println("See ya!"); }
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT>   <FONT COLOR="#000080">crash</FONT>()      { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Nooo! Argh!!!&quot;</FONT>); }</tt>
+
  public void    shutdown()  { System.out.println("Bye!"); }
    <tt><B>public</B> <FONT COLOR="#800000">boolean</FONT> <FONT COLOR="#000080">h&aacute;Intrusos</FONT>() { <B>return</B> <B>false</B>; } <I><FONT COLOR="#808080">// detector de v&iacute;rus</FONT></I></tt>
+
  public void    crash()      { System.out.println("Nooo! Argh!!!"); }
  <tt>}</tt>
+
  public boolean háIntrusos() { return false; } // detector de vírus
 +
}
 +
</source>
  
Note-se a coincidência do nome <code>háIntrusos</code>: existe na classe <code>XP</code> e na interface <code>Vigilante</code> (da qual <code>Robot</code> herda parte da sua especificação). É necessário garantir que a semântica pretendida é a que o método realmente fornece.
+
Note-se a coincidência do método '''háIntrusos()''': existe na classe '''XP''' e na interface '''Vigilante''' (da qual '''Robot''' herda parte da sua especificação). É necessário garantir que a semântica pretendida é a que o método realmente fornece.
  
 
==XP2018==
 
==XP2018==
  
Esta é uma implementação de <code>Robot</code> que reutiliza <code>XP</code>.
+
Esta é uma implementação de '''Robot''' que reutiliza '''XP'''.
  
  <tt><B>public</B> <B>class</B> XP2018 <B>extends</B> XP <B>implements</B> <FONT COLOR="#000000">Robot</FONT> {</tt>
+
<source lang="java">
    <tt><I><FONT COLOR="#808080">// interface Robot</FONT></I></tt>
+
public class XP2018 extends XP implements Robot {
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">avisarIntrusos</FONT>()  { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Isto &eacute; o &uacute;ltimo aviso!&quot;</FONT>); }</tt>
+
  // interface Robot
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">destruirIntrusos</FONT>() { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Eu avisei...&quot;</FONT>); }</tt>
+
  public void avisarIntrusos()  { System.out.println("Isto é o último aviso!"); }
 
+
  public void destruirIntrusos() { System.out.println("Eu avisei..."); }
    <tt><I><FONT COLOR="#808080">// interface Vigilante</FONT></I></tt>
+
    <tt><B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">soarAlarme</FONT>() { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;</FONT><FONT COLOR="#dd0000">AAAARGH</FONT><FONT COLOR="#dd0000">&quot;</FONT>); }</tt>
+
  // interface Vigilante
 
+
  public void soarAlarme() { System.out.println("AAAARGH"); }
    <tt><I><FONT COLOR="#808080">//public boolean h&aacute;Intrusos() { return true; } // herdado de XP...</FONT></I></tt>
+
  <tt>}</tt>
+
  //public boolean háIntrusos() { return true; } // herdado de XP...
 +
}
 +
</source>
  
Note-se que o método <code>háIntrusos</code> é implementado pela superclasse (<code>XP</code>). A consideração deste aspecto é de importância crucial, pois pode introduzir erros se o comportamento não for o desejado (o que provavelmente acontece: em <code>XP</code>, os intrusos são vírus -- por hipótese -- e em <code>XP2003</code>, uma implementação de um vigilante robotizado, a semântica é outra).
+
Note-se que o método '''háIntrusos()''' é implementado pela superclasse ('''XP'''). A consideração deste aspecto é de importância crucial, pois pode introduzir erros se o comportamento não for o desejado (o que provavelmente acontece: em '''XP''', os intrusos são -- por hipótese -- virus e em '''XP2018''', uma implementação de um vigilante robotizado, a semântica é outra).
  
 
==Aplicação==
 
==Aplicação==
  
 
Considere-se a seguinte classe que exercita os conceitos anteriores:
 
Considere-se a seguinte classe que exercita os conceitos anteriores:
 
+
<source lang="java">
  <tt><B>public</B> <B>class</B> Teste {</tt>
+
public class Teste {
    <tt><B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">main</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B>[] args) {</tt>
+
  public static void main(String[] args) {
      <tt>C&atilde;o       c = <B>new</B> <FONT COLOR="#000080">Chihuahua</FONT>();</tt>
+
    Cão       c = new Chihuahua();
      <tt>Vigilante v = <B>new</B> <FONT COLOR="#000080">Chihuahua</FONT>();</tt>
+
    Vigilante v = new Chihuahua();
      <tt>C&atilde;oPastor p = <B>new</B> <FONT COLOR="#000080">Chihuahua</FONT>();</tt>
+
    CãoPastor p = new Chihuahua();
      <tt><FONT COLOR="#000000">Robot</FONT>     r = <B>new</B> <FONT COLOR="#000080">XP2003</FONT>();</tt>
+
    Robot    r = new XP2018();
      <tt>XP        x = <B>new</B> <FONT COLOR="#000080">XP</FONT>();</tt>
+
    XP        x = new XP();
      <tt>XP        y = <B>new</B> <FONT COLOR="#000080">XP2018</FONT>();</tt>
+
    XP        y = new XP2018();
 
+
      <tt>c.<FONT COLOR="#000080">ladrar</FONT>();</tt>
+
    c.ladrar();
      <tt>v.<FONT COLOR="#000080">soarAlarme</FONT>();</tt>
+
    v.soarAlarme();
      <tt>((Chihuahua)v).<FONT COLOR="#000080">ladrar</FONT>();</tt>
+
    ((Chihuahua)v).ladrar();
      <tt>p.<FONT COLOR="#000080">soarAlarme</FONT>();</tt>
+
    p.soarAlarme();
      <tt>r.<FONT COLOR="#000080">avisarIntrusos</FONT>();</tt>
+
    r.avisarIntrusos();
      <tt>r.<FONT COLOR="#000080">soarAlarme</FONT>();</tt>
+
    r.soarAlarme();
      <tt>x.<FONT COLOR="#000080">reboot</FONT>();</tt>
+
    x.reboot();
      <tt>y.<FONT COLOR="#000080">crash</FONT>();</tt>
+
    y.crash();
      <tt>((XP2018)y).<FONT COLOR="#000080">soarAlarme</FONT>();</tt>
+
    ((XP2018)y).soarAlarme();
    <tt>}</tt>
+
  }
  <tt>}</tt>
+
}
 +
</source>
  
 
==Resultado==
 
==Resultado==

Latest revision as of 13:17, 13 October 2020

O seguinte exemplo ilustra a utilização de interfaces em Java. Note-se que, além das interfaces, são também utilizadas classes abstractas, por forma a contrastar a utilização de cada conceito. O diagrama UML fornece uma panorâmica do conjunto de interfaces e classes: a amarelo estão representadas as interfaces e a verde as classes abstractas; as classes normais estão a branco.

Diagrama de classes para o exemplo descrito.

O exemplo implementa vários conceitos, sendo os principais o de cão e o de vigilante. São definidos outros conceitos que especializam estes e outros que fornecem implementações concretas de cada um. Assim, o conceito de robot é o de um vigilante automático e o de cão de guarda um vigilante canino.

São utilizadas as seguintes interfaces e classes: Cão, Vigilante, CãoDeGuarda, CãoPastor, Chihuahua, Robot, XP, XP2018.

Cão

A interface Cão define as assinaturas dos métodos a que qualquer classe que implemente um cão deve saber responder.

 interface Cão {
   void ladrar();
   int  nPatas();
 }

Embora nada seja expresso na interface, além da assinatura, assume-se que a semântica a associar a cada método é a seguinte:

  • ladrar() - executa a acção de produzir um latido
  • nPatas() - calcula/retorna o número de patas do cão

As classes que implementem a interface, embora não sejam obrigadas a implementar esta semântica, têm todo o interesse em fazê-lo.

Vigilante

Por seu turno, a interface Vigilante define as assinaturas dos métodos a que uma entidade "vigilante" deve saber responder.

 interface Vigilante {
   boolean háIntrusos();
   void    soarAlarme();
 }

A semântica a associar pelas implementações é a seguinte:

  • háIntrusos() - retorna true se tiverem sido detectados intrusos
  • soarAlarme() - executa a acção de activar um alarme, e.g. um sinal sonoro

Robot

A interface Robot é uma especialização de Vigilante: é um vigilante robotizado que sabe avisar e destruir intrusos.

 interface Robot extends Vigilante {
   void avisarIntrusos();
   void destruirIntrusos();
 }

As implementações da interface Robot, além do que já se disse para a interface Vigilante, devem fornecer a seguinte semântica por método:

  • avisarIntrusos() -- deve ser emitido um aviso (possivelmente, porque depois se segue a invocação do método destruirIntrusos() -- mas não há qualquer garantia...)
  • destruirIntrusos() -- a acção a executar corresponde à destruição dos intrusos

Cão de Guarda

A interface CãoDeGuarda, de modo análogo a Robot define a assinatura das implementações de um cão de guarda, i.e., um cão vigilante.

 interface CãoDeGuarda extends Cão, Vigilante {
   void morder();
 }

Note-se a utilização de herança múltipla relativamente às interfaces.

Cão Pastor

A primeira classe deste exemplo é CãoPastor. Esta classe implementa parte da interface de um cão de guarda e deixa para as suas subclasses a especificidade associada ao método ladrar(). Embora abstracta, esta classe é uma implementação (ainda que parcial) da interface.

 public abstract class CãoPastor implements CãoDeGuarda {
   public final static int N_PATAS = 4;
 
   // métodos privados
   private void    fecharBoca()   { /* qualquer coisa */ }
   private boolean háPredadores() {
     /* qualquer coisa */
     return true;
   }
 
   // interface CãoDeGuarda
   public void morder() { fecharBoca(); }
 
   // inteface Cão
   public int  nPatas() { return N_PATAS; }
   public abstract void ladrar();
 
   // interface Vigilante
   public void    soarAlarme() { ladrar(); }
   public boolean háIntrusos() { return háPredadores(); }
 }

Chihuahua

Um exemplo de uma classe (não abstracta, i.e., implementa ladrar()) derivada de CãoDeGuarda é a que se segue. Esta classe apenas necessita de implementar o método ladrar() para ficar completa.

 public class Chihuahua extends CãoPastor {
   public void ladrar() { System.out.println("guau, guau"); }
 }

XP

Supõe-se que a classe XP existe independentemente das outras descritas até aqui (foi, por exemplo, definida para outro fim). Supõe-se, contudo, que contém funcionalidade útil para uma possível implementação de um robot, i.e., para uma classe que implemente a interface Robot.

 public class XP {
   public void    reboot()     { System.out.println("See ya!"); }
   public void    shutdown()   { System.out.println("Bye!"); }
   public void    crash()      { System.out.println("Nooo! Argh!!!"); }
   public boolean háIntrusos() { return false; } // detector de vírus
 }

Note-se a coincidência do método háIntrusos(): existe na classe XP e na interface Vigilante (da qual Robot herda parte da sua especificação). É necessário garantir que a semântica pretendida é a que o método realmente fornece.

XP2018

Esta é uma implementação de Robot que reutiliza XP.

 public class XP2018 extends XP implements Robot {
   // interface Robot
   public void avisarIntrusos()   { System.out.println("Isto é o último aviso!"); }
   public void destruirIntrusos() { System.out.println("Eu avisei..."); }
 
   // interface Vigilante
   public void soarAlarme() { System.out.println("AAAARGH"); }
 
   //public boolean háIntrusos() { return true; } // herdado de XP...
 }

Note-se que o método háIntrusos() é implementado pela superclasse (XP). A consideração deste aspecto é de importância crucial, pois pode introduzir erros se o comportamento não for o desejado (o que provavelmente acontece: em XP, os intrusos são -- por hipótese -- virus e em XP2018, uma implementação de um vigilante robotizado, a semântica é outra).

Aplicação

Considere-se a seguinte classe que exercita os conceitos anteriores:

 public class Teste {
   public static void main(String[] args) {
     Cão       c = new Chihuahua();
     Vigilante v = new Chihuahua();
     CãoPastor p = new Chihuahua();
     Robot     r = new XP2018();
     XP        x = new XP();
     XP        y = new XP2018();
 
     c.ladrar();
     v.soarAlarme();
     ((Chihuahua)v).ladrar();
     p.soarAlarme();
     r.avisarIntrusos();
     r.soarAlarme();
     x.reboot();
     y.crash();
     ((XP2018)y).soarAlarme();
   }
 }

Resultado

O resultado da aplicação acima é o seguinte:

 $ java Teste
 guau, guau
 guau, guau
 guau, guau
 guau, guau
 Isto é o último aviso!
 AAAARGH
 See ya!
 Nooo! Argh!!!
 AAAARGH