Nada

Föreläsning 1: Klasser, interface och event

Programutvecklingsteknik är ett tillräckligt vagt namn på denna fortsättningskurs för att man ska kunna ta med just det som är roligt, hett och nyttigt. Jag har gått igenom en årgång av Dr Dobb's Journal och tagit fasta på bland annat följande:

Objekt och klasser

I Java förekommer ordet static i en del deklarationer. När programmet startas finns bara static-deklarerade variabler och metoder; övriga skapas med new under körningens gång. Ett objekt är just det som skapas med new. I objektorienterad programmering låter man så mycket som möjligt vara objekt, och därför förekommer ofta static på ett enda ställe, nämligen i
public static void main(String[] args){...}

Viktigaste användningen för objekt är grafiska komponenter som fönster och knappar. I Java finns ett enormt komponentbibliotek som man kommer åt med import java.awt.*; för den ursprungliga uppsättningen och import javax.swing.*; för den modernare, som ser bättre ut.

Komponenterna är ordnade i en hierarki med Object överst och dom mest förfinade och innehållsrika komponenterna underst. Den undre klassen ärver alla egenskaper från den övre klassen och lägger till en del egna. Man ritar enligt UML-standarden en pil från den undre till den övre klassen.

Här är ett exempel på en klass PatiensKort som ärver klassen Kort och lägger till en egenskap.

class Kort                         {
     String färg                   ;
     int valör                     ;}
class PatiensKort extends Kort     {
     boolean rättvänd = true       ;}  //nyskapat kort är rättvänt
 - - -
PatiensKort kortet = new PatiensKort();//skapa ett objekt
kortet.färg="spader"                  ;
kortet.valör=7"                       ;
kortet.rättvänd=false                 ;
Det verkar proffsigare om man gör datafälten private så att dom bara kan kommas åt med metodanrop. Det är också god stil att alltid ha en metod toString(). Därmed kan man skriva ut objektet med System.out.print.
public class Kort                         {  //filen Kort.java
    private String färg                   ;
    private int valör                     ;
    public Kort(String färgen,int valören){  //konstruktor
	färg=färgen                       ;
        valör=valören                     ;}
    public String getFärg()               {
	return färg                       ;}
    public int getValör()                 {
	return valör                      ;}
    public String toString()              {
        return färg+" "+valör             ;}}

public class PatiensKort extends Kort        {  //PatiensKort.java
    private boolean rättvänd=true            ;
    public PatiensKort(String färg,int valör){
	super(färg,valör)                    ;} //konstruktorn ovanför
    public void vänd()                       {
	rättvänd=!rättvänd                   ;}
    public boolean getRättvänd()             {
	return rättvänd                      ;}
    public String toString()                 {
	if(rättvänd) return super.toString() ;
        else return "baksida"                ;}}

public class Korttest                                 {//Korttest.java
    public static void main(String[] args)            {
	PatiensKort kortet=new PatiensKort("spader",7);
	System.out.println(kortet)                    ;
        kortet.vänd()                                 ;
	System.out.println(kortet)                    ;}}

Klassdiagram med UML

UML, unified modeling language, är en standard för visuell beskrivning av objektmodeller. Egentligen ingår en massa olika diagramtyper, nämligen följande. Vi ska bara använda klassdiagram. Varje klass ritas som en rektangel där klassnamnet och eventuellt publika metoder står. Om A är subklass till B, (class A extends B), ritas en pil från A till B och den utläses ofta "en A är en B". Ett streck mellan klass C och klass D utläses "en C har en D", och man kan sätta siffror eller intervall i var sin ände på strecket för att till exempel uttrycka "en kortlek har 52 kort" eller "en månad har 28..31 dagar". Obestämt antal betecknas med asterisk.
      
                       _____
                      |Kort |
                      |_____|
                         ^
   _______          _____|_____ 
  |Kortlek|1     52|Patienskort|
  |_______|--------|___________|

Ett krångligare diagram kan se ut så här. Man kan alltså sätta namn och riktning på strecken och man kan sätta en fylld eller ofylld romb i ena änden för att beteckna aggregat. En student registrerar sej för ett aggregat av kurser men har också andra egnskaper, därför fylld romb. En läroplan utgörs av ett aggregat av kurser, därför ofylld romb.

Interface

En klass kan ärva högst en annan klass men dessutom kan den implementera ett eller flera interface. Så här kan det se ut.
public class Pnyxtr extends Applet implements Runnable,ActionListener
Den enda funktionen är att tala om för kompilatorn att vissa metoder finns deklarerade i Pnyxtr, nämligen run och actionPerformed. Filen Runnable.java i javabiblioteket ser nämligen ut så här.
interface Runnable {
  public void run();}
Vitsen med interface är att alla objekt som implementerar Runnable får vara parametrar till en metod som deklarerats
  public void Exekvera(Runnable objektet){...}
I UML ritar man egentligen interface med rundade hörn men det klarar inte ASCII-grafiken. Implements är en streckad pil.
      
       ______   ________    ______________
      |Applet| |Runnable|  |ActionListener|
      |______| |________|  |______________|
         ^         ^            ^
         |  _ _ _ _|            |
         | |   _ _ _ _ _ _ _ _ _|
        _|_|__|_ 
       |Pnyxtr  |
       |________|

Event och lyssnare

Varje tangenttryckning och varje musrörelse skapar ett Event-objekt som skickas iväg till alla lyssnarobjekt som registrerats för tangentbordet eller den grafiska komponent som musen pekar på. Lyssnarobjektet måste implementera ActionListener, MouseListener eller annat lämpligt interface och har en eller flera metoder, t ex actionPerformed som tar emot eventobjektet och reagerar på lämpligt sätt.

Det ritas enklast med streckad linje med riktningspil. Så här blir det om man har en knapp med ljudeffekt.

      
    ______       ______________
   |Button|     |ActionListener|
   |______|     |______________|
      ^              ^
    __|__         ___|____         __________
   |Knapp|- - > -|Lyssnare|- - > -|Ljudeffekt|
   |_____|       |________|       |__________|

Referenskort för UML

Allen Holub har gjort den bästa webbsidan.
Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 16 mars 2004
Tekniskt stöd: <webmaster@nada.kth.se>