java:interface_implementation

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:interface_implementation [2017/03/31 13:11]
gthanos [Υλοποίηση του Interface]
java:interface_implementation [2017/03/31 13:33]
gthanos [StartStopTimer]
Line 5: Line 5:
 Σε συνέχεια του προηγούμενου παραδείγματος θα επιχειρήσουμε να δημιουργήσουμε δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο //​interface//​. Οι κλάσεις αυτές είναι **SimpleTimer** και **StartStopTimer**. Και οι δύο κλάσεις παρέχουν την ίδια λειτουργικότητα. Σε συνέχεια του προηγούμενου παραδείγματος θα επιχειρήσουμε να δημιουργήσουμε δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο //​interface//​. Οι κλάσεις αυτές είναι **SimpleTimer** και **StartStopTimer**. Και οι δύο κλάσεις παρέχουν την ίδια λειτουργικότητα.
  
-===== ArrayStack ​=====+===== SimpleTimer ​=====
  
-<code java ArrayStack.java> +<code java SimpleTimer.java> 
-public ​class ArrayStack ​implements ​Stack +class SimpleTimer ​implements ​Timer 
-  ​public int capacity+  ​private long start_time, duration
-  ​public Object []array+  ​private boolean running = false; 
-  public int size;+ 
 +  public ​void setTimer(int seconds) { 
 +    duration = seconds * 1000; 
 +  }
   ​   ​
-  public ​ArrayStack() { +  public ​boolean startTimer() { 
-    ​this(256);+    ​Date now = new Date()
 +    if(duration > 0) { 
 +      start_time = now.getTime();​ 
 +      running = true; 
 +    } 
 +    else { 
 +      running = false; 
 +    } 
 +    return running;
   }   }
   ​   ​
-  public ​ArrayStack(int capacity) { +  public ​void stopTimer() { 
-    ​array = new Object[capacity]+    ​Date now = new Date()    
-    ​this.capacity ​capacity+    ​if( running && now.getTime() > start_time) 
-    ​size 0;+      duration -now.getTime() - start_time
 +    ​running ​false;
   }   }
   ​   ​
-  public ​int size() { +  public ​boolean isRunning() { 
-    return ​size;+    return ​running;
   }   }
   ​   ​
-  public ​void push(Object o) { +  public ​boolean hasExpired() { 
-   +    Date now = new Date(); 
-    if( size >= capacity-1 ​) { +    if( (running && now.getTime() - start_time ​>= duration) || duration <= 0 ) {       
-      capacity *= 2; +      ​start_time ​0L
-      ​Object []newArray ​new Object[capacity]+      ​duration ​0L
-      ​for(int i=0; i<​array.length;​ i++) +      ​running ​false
-        newArray[i] = array[i]+      ​return true;
-      ​array newArray+
-      ​newArray = null;+
     }     }
-    ​array[size++] = o;+    ​return false;
   }   }
   ​   ​
-  public Object pop() { 
-    return array[--size];​ 
-  } 
-  ​ 
-  public Object top() { 
-    return array[size-1];​ 
-  } 
-  ​ 
-  public String toString() { 
-    String str = "​@@@@@@@@ - Stack - @@@@@@@@\n";​ 
-    for(int i=size-1; i>=0; i--) 
-      str += array[i].toString()+"​\n";​ 
-    return str + "​@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";​ 
-  }  ​ 
 } }
 </​code>​ </​code>​
  
-===== LinkedStack ​=====+===== StartStopTimer ​=====
  
-<code java LinkedStack.java> +<code java StartStopTimer.java> 
-class LinkedNode ​+class StartStop implements Timer 
-  private ​Object o+  private ​long start_time, duration
-  ​private LinkedNode next; +  ​ArrayList starts ​new ArrayList(); 
-   +  ​ArrayList stops = new ArrayList(); 
-  public LinkedNode(LinkedNode nxt, Object e) { +  ​private boolean running ​false;
-    next nxt; +
-    o = e; +
-  } +
-   +
-  public LinkedNode(Object e) { +
-    this(null, e); +
-  ​+
-   +
-  public Object getElement() { return o} +
-  ​public LinkedNode getNext() { return next; } +
-   +
-  public void setElement(Object e) { o e+
-  public void setNext(LinkedNode node) { next = node; } +
-}+
  
-public ​class LinkedStack implements Stack { +  ​public ​void setTimer(int seconds) { 
-  ​int size; +    ​duration ​seconds * 1000;
-  LinkedNode head; +
- +
-  public LinkedStack() { +
-    ​size=0; +
-    head null;+
   }   }
-  ​ +  public ​boolean startTimer() { 
-  ​public ​int size() { +    long now = new Date().getTime();​ 
-    return ​size;+    if(!running) { 
 +      starts.add(now);​ 
 +      running = true; 
 +    } 
 +    return ​running;
   }   }
-  ​ +  public void stopTimer() {     
-  ​public void push(Object o) { +    ​long now = new Date().getTime(); 
-    // the following is OK even if head == null. +    ​if(running) { 
-    ​head = new LinkedNode(head, o); +      stops.add(now); 
-    ​size++;+      running = false; 
 +    }
   }   }
-  ​ +  public ​boolean isRunning() { 
-  ​public ​Object pop() { +    return ​running;
-    LinkedNode pN = head; +
-    head = head.getNext();​ +
-    size--; +
-    return ​pN.getElement();+
   }   }
   ​   ​
-  public ​Object top() { +  public ​boolean hasExpired() { 
-    return ​head+    ​if( !running ) 
-  } +      ​return ​running
-   +    long runtime = 0L; 
-  public String toString() { +    for(int i=0; i<​stops.size();​ i++) { 
-    ​String str "​@@@@@@@@ ​Stack - @@@@@@@@\n"​+      ​runtime +(long)((Long)stops.get(i) ​(Long)starts.get(i))
-    ​LinkedNode curr = head; +    ​} 
-    ​while(curr != null+    ​long now = new Date().getTime(); 
-      ​str ​+= curr.getElement().toString(); +    ​runtime ​+= now - (Long)starts.get(stops.size()); 
-    return ​str + "​@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"​;+    ​if( running && runtime > duration ) { 
 +      start_time = 0; 
 +      duration = 0; 
 +      running = false; 
 +      ​return ​true; 
 +    } 
 +    return false;
   }   }
 } }
 </​code>​ </​code>​
  
-Παραπάνω έχουμε υλοποιήσει το συγκεκριμένο //​interface//​ μέσα από δύο διαφορετικές κλάσεις. Αν και η υλοποίηση των κλάσεων διαφέρει σημαντικά,​ η λειτουργία τους είναι ​κοινή. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από της δύο κλάσεις για να εξυπηρετήσετε τη λειτουργικότητα του //​interface//​ **Stack** σε ένα πρόγραμμα.+Παραπάνω έχουμε υλοποιήσει το συγκεκριμένο //​interface//​ μέσα από δύο διαφορετικές κλάσεις. Αν και η υλοποίηση των κλάσεων διαφέρει σημαντικά,​ η λειτουργικότητα που παρέχουν ​είναι ισοδύναμη. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε από της δύο κλάσεις για να εξυπηρετήσετε τη λειτουργικότητα του //​interface//​ **Timer** σε ένα πρόγραμμα.
  
-| Προηγούμενο : [[ :java:interface_implementation | Υλοποίηση του interface  ​]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​interface_as_data_type | Το interface ως τύπος δεδομένων ]]  |+| Προηγούμενο : [[ java:interface_definition ​]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​interface_as_data_type | Το interface ως τύπος δεδομένων ]]  |
  
java/interface_implementation.txt · Last modified: 2019/04/05 17:20 by gthanos