Vorbereitung auf die Prüfung Arthur Zaczek Jän 2015 Vorbereitung auf die Prüfung 1 Einleitung 1.1 Inhalt • Dieses Dokument soll Ihnen helfen, sich besser auf die Prüfung vorzubereiten. • Es wird der Inhalt der LV mit der Übung verglichen. • Einzelne Aspekte werden nochmals hervorgehoben Das bedeutet nicht, dass der Inhalt dieses Dokumentes so zur Prüfung geben wird! 2 2.1 Interfaces Definieren public interface Url { /** * @return Returns the path of the url, without parameter. */ String getPath(); } public interface IUrl { /// <summary> /// Returns the path of the url, without parameter. /// </summary> string Path { get; } } 2.2 Implementieren public class UrlImpl implements Url { @Override public String getPath() { ... } } public class UrlImpl : IUrl { public string Path { get { return _path; } } } 1 Vorbereitung auf die Prüfung 2.3 Polymorphismus Url url = new UrlImpl(); IUrl url = new UrlImpl(); Die Implementierung der Url ist (auch) vom Typ Url bzw. IUrl Dadurch wird die konkrete Implementierung vom verlangten Typ entkoppelt. 2.4 Typen Collection<String> lst = new ArrayList<String>(); Collection<String> lst = new LinkedList<String>(); Url url = new ArthursUrl(); Url url = new AlexandersUrl(); Url url = new SebastiansUrl(); ICollection<String> lst = new List<String>(); ICollection<String> lst = new LinkedList<String>(); IUrl url = new ArthursUrl(); IUrl url = new AlexandersUrl(); IUrl url = new SebastiansUrl(); Die Instanz lst ist sowohl vom Typ ArrayList bzw. List als auch vom Interface Typ Collection bzw. ICollection Die Instanz url ist sowohl vom Typ ArthursUrl als auch vom Interface Typ Url bzw. IUrl 3 3.1 Klassen Definieren public class Response { } public class Response { } 3.2 Methoden public class Response { public void addHeader() { ... } } 2 Vorbereitung auf die Prüfung public class Response { public void AddHeader() { ... } } 3.3 Eigenschaften / Properties public class Response { public int getStatusCode() { } public void setStatusCode(int status) { } } public class Response { public int StatusCode { get; set; } } 3.4 Ableiten Ein BasePlugin stellt Basisfunktionalität zur Verfügung. public class FilePlugin extends BasePlugin { } public class FilePlugin : BasePlugin { } 3.5 BasePlugin public class BasePlugin { public string getName() { ... } public string getDescription() { ... } protected Configuration getConfig() { ... } protected void log(string msg) { ... } } public class BasePlugin { public virtual string Name { get { ... } } 3 Vorbereitung auf die Prüfung public virtual string Description { get { ... } } protected Configuration Config { get{ ... } } protected void Log(string msg) { ... } } 3.6 Beschreibung BasePlugin • Die Eigenschaften Name & Description können auch von einem Interface definiert werden. – Diese könnten von einem Plugins Plugin genutzt werden, um Plugins zu verwalten – Im Logfile könnte die Eigenschaft Name mitgeschrieben werden 3.7 Beschreibung BasePlugin • Die Eigenschaften Config vom Typ Configuration speichert eine Instanz der aktuellen Konfiguration. – – – – 3.8 Basispfad Pluginpfad Inhalt der Konfigurationsdatei etc. Beschreibung BasePlugin • Die Methode log bzw. Log sorgt für ein einheitliches Format im Logfiles aller Plugins 3.9 Typen FilePlugin p = new FilePlugin(); BasePlugin p = new FilePlugin(); Plugin p = new FilePlugin(); FilePlugin p = new FilePlugin(); BasePlugin p = new FilePlugin(); IPlugin p = new FilePlugin(); Die Instanz p ist sowohl vom Typ FilePlugin als auch vom Typ BasePlugin als auch vom Interface Typ Plugin bzw. IPlugin 3.10 Java Beispiele java.io.InputStream java.io.FilterInputStream java.io.BufferedInputStream java.util.AbstractCollection<E> 4 Vorbereitung auf die Prüfung java.util.AbstractList<E> java.util.ArrayList<E> java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IllegalArgumentException java.lang.NumberFormatException 3.11 C# Beispiele System.MarshalByRefObject System.IO.Stream System.IO.FileStream System.Exception System.SystemException System.ArgumentException System.ArgumentNullException 3.12 Überschreiben In einer Abgeleiteten Klasse wird eine Methode oder Eigenschaft neu implementiert, um die Funktionalität zu verändern oder zu ergänzen. public class FilePlugin extends BasePlugin { @Override public string getName() { ... } @Override public string getDescription() { ... } } public class FilePlugin : BasePlugin { public override string Name { get { ... } } public override string Description { get { ... } } } 3.13 Überladen Eine Methode mit dem gleichen Namen, aber anderen Parametern. Sinnvollerweise sollte das Verhalten gleich sein und sich nur durch die Argumente unterscheiden. public class BasePlugin { // Nachricht protokollieren mit LogLevel.INFO protected void log(string msg) { ... } // Nachricht protokollieren mit übergebenen LogLevel protected void log(LogLevel level, string msg) { ... } } 5 Vorbereitung auf die Prüfung public class BasePlugin { // Nachricht protokollieren mit LogLevel.INFO protected void Log(string msg) { ... } // Nachricht protokollieren mit übergebenen LogLevel protected void Log(LogLevel level, string msg) { ... } } 3.14 Alles zusammen public interface Plugin { string getName(); } public abstract class BasePlugin implements Plugin { public string getName() { ... } protected void log(string msg) { ... } protected void log(LogLevel level, string msg) { ... } } public class FilePlugin extends BasePlugin { @Override public string getName() { ... } } Plugin p = new FilePlugin(); BasePlugin p = new FilePlugin(); FilePlugin p = new FilePlugin(); 3.15 Alles zusammen public interface IPlugin { string Name { get; } } public abstract class BasePlugin : IPlugin { public virtual string Name { get { ... } } protected void log(string msg) { ... } protected void log(LogLevel level, string msg) { ... } } public class FilePlugin : BasePlugin { public override string Name { get { ... } } } Plugin p = new FilePlugin(); BasePlugin p = new FilePlugin(); FilePlugin p = new FilePlugin(); 6 Vorbereitung auf die Prüfung 4 Abstrakte Klassen 4.1 Definieren public abstract class BasePlugin { public abstract string getName(); public abstract string getDescription(); } public abstract class BasePlugin { public abstract string Name { get; } public abstract string Description { get; } } 4.2 Auswirkung • Diese Klassen können nicht instanziiert werden. • Ableiter sind gezwungen, abstrakte Methoden & Eigenschaften zu implementieren. • Eine Implementierung kann wie bei gewöhnlichen zur Verfügung gestellt werden. Abstrakte Klassen vereinen die Eigenschaften von Interfaces und Basisklassen 4.3 Typen Java und C# BasePlugin p = new FilePlugin(); 5 5.1 Interfaces, abstrakte Klassen, Klassen und Arrays Array mit Interface Url a[] = new Url[3]; a[0] = new ArthursUrl(); a[1] = new AlexandersUrl(); a[2] = new SebastiansUrl(); IUrl a[0] a[1] a[2] a[] = = new = new = new new IUrl[3]; ArthursUrl(); AlexandersUrl(); SebastiansUrl(); Dieses Array beinhaltet 3 unterschiedliche Klassen, die alle das Interface Url bzw. IUrl implementieren. 7 Vorbereitung auf die Prüfung 5.2 Array mit abstrakter Klassen BasePlugin a[0] = new a[1] = new a[2] = new a[] = new BasePlugin[3]; FilePlugin(); TemperaturePlugin(); ToUpperPlugin(); BasePlugin a[0] = new a[1] = new a[2] = new a[] = new BasePlugin[3]; FilePlugin(); TemperaturePlugin(); ToUpperPlugin(); Dieses Array beinhaltet 3 unterschiedliche Klassen, die alle das Interface Url bzw. IUrl implementieren. 5.3 Array mit Klassen . . . you got the point! 6 6.1 Streams Java // schreiben ByteArrayOutputStream s = new ByteArrayOutputStream(); DataOutputStream sw = new DataOutputStream(s); sw.writeUTF("Lore ipsum"); sw.writeInt(1234); // in ein byte[] konvertieren byte[] byteArray = s.toByteArray(); // wieder aus dem byte[] auslesen InputStream inputStream = new ByteArrayInputStream(byteArray); DataInputStream sr = new DataInputStream(s); String str = sr.readUTF(); int i = sr.readInt(); 6.2 CS // schreiben var ms = new MemoryStream(); var sw = new BinaryWriter(ms); sw.Write("Lore ipsum"); sw.Write(1234); // Stream zurück an den Anfang setzen 8 Vorbereitung auf die Prüfung ms.Seek(0, SeekOrigin.Begin); // wieder aus dem Stream auslesen var sr = new BinaryReader(ms); var str = sr.ReadString(); var i = sr.ReadInt32(); 7 7.1 Tipps Javas secret Array Class List<BasePlugin> lst = Arrays.asList(new FilePlugin(), new ToUpperPlugin(), new TemperaturePlugin( 7.2 C# list initializer List<BasePlugin> lst = new List<BasePlugin>() { new FilePlugin(), new ToUpperPlugin(), new TemperaturePlugin() }; 9