2009-03-31 5 views
0

J'ai été à la recherche court et de bons exemples pour démontrer les fonctionnalités OO d'une langue comme une introduction à d'autres programmeurs. Par "bon", je veux dire, ils peuvent être exécutés et produire quelque chose de plutôt significatif que des trucs foobar. Par exemple, vous pouvez illustrer la plupart des constructions de flux de contrôle par un exemple de jeu de mandelbrots ou des aspects fonctionnels par un exemple de mergesort. Mais je n'ai pas encore trouvé un bon exemple pour les constructions OO.Quels sont de bons exemples pour avoir une idée des fonctionnalités et des constructions d'OO?

Répondre

1

Un exemple "réel" qui est assez simple à comprendre est la classe java.io.InputStream et ses enfants. C'est un bon exemple de polymorphisme: si vous écrivez votre code pour comprendre comment utiliser InputStream, peu importe le fonctionnement de la classe sous-jacente, tant qu'elle est conforme au contrat imposé par InputStream. Donc, vous pouvez avoir une méthode dans une classe

public void dump(InputStream in) throws IOException { 
    int b; 
    while((b = in.read()) >= 0) { 
    System.out.println(b); 
    } 
} 

Cette méthode ne se soucie pas d'où proviennent les données.

Maintenant, si vous voulez utiliser la méthode de vidage des données à partir d'un fichier, vous pouvez appeler

dump(new FileInputStream("file")); 

ou, si vous voulez utiliser dump des données à partir d'une prise,

dump(socket.getInputStream()); 

ou, si vous avez un tableau d'octets, vous pouvez appeler

dump(new ByteArrayInputStream(theArray)); 

Il existe des implémentations si InputStream qui enveloppent othe r InputStreams. Par exemple, SequenceInputStream vous permet GLOM plusieurs InputStreams en un seul:

dump(new SequenceInputStream(new FileInputStream("file1"), 
          new FileInputStream("file2")); 

Si vous voulez créer votre propre, InputStream personnalisé, vous pouvez étendre la classe InputStream, et remplacer la méthode de lecture int():

public class ZerosInputStream extends InputStream { 
    protected int howManyZeros; 
    protected int index = 0; 
    public ZerosInputStream(int howManyZeros) { 
     this.howManyZeros = howManyZeros; 
    } 

    @Override 
    public int read() throws IOException { 
    if(index < howManyZeros) { 
     index++; 
     return 0; 
    } else { 
     return -1; 
    } 
    } 

Ensuite, vous pouvez utiliser que dans votre appel de vidage:

dump(new ZerosInputStream(500)); 
Questions connexes