4. Arv och dynamisk bindning

Slides:



Advertisements
Liknande presentationer
Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
Advertisements

Avlusning Debugger (”avlusare”) Breakpoints Watch.
Klasser och objekt.
Fortsättningskurs i Programmering lektion 6
Klassarv och inkapsling
OOP Objekt-orienterad programmering
Metoder i java Det finns två typer av metoder i java
Arv.
Abstract & sealed.
Polymorfism.
Metoder.
Programmeringsteknik för K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
1 Föreläsning 6 Klass Object, instans av klass public/private Klassvariabler och klassmetoder.
Alice in Action with Java
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektbaserad programmering –Grundläggande om klasser och objekt – (Arv får vänta)  Iden med klasser.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Konstruktor Ser till att objektets data är korrekt initierade MinKlass::MinKlass(); MinKlass::MinKlass(int.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2004 Datastrukturer och algoritmer Föreläsning 3.
Programmering i C# 2. Inledande detaljer.
Föreläsning 11 Arrayer.
Objektorienterad programmering i Java
Programmering i C# 3. Klasser.
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Vektorer (klassen Vector) Sortering
Polymorfism.
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Räckvidd och synlighet. Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 22 Synlighet (meddelandesändning) Det.
Programmering i C# 5. Structer.
Arv.
TÄNK PÅ ETT HELTAL MELLAN 1-50
Programmeringsteknik för Media1 & K1
1. En infrastruktur för programutveckling
OOP F6:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 6 Mer om klasser och objekt Hantera många objekt ArrayList toString() – metoden.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Föreläsning 8 Arv och abstrakta klasser. Arv Definierar en klass utifrån en redan existerande klass Den nya klassen utökar den ärvda klassen ( extends.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata.
Riktade listor i C och Java Lösning till gruppövning 1.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Föreläsning 8 Programmeringsteknik och Matlab DD1312 Klassmetoder Egen modul, Self Metoderna: __str__, __lt__,… Meddelande Arv, Överlagring av metoder,
Programmering i C# 9. Pekare och osäker kod.
Föreläsning 9 Gränssnitt. Super Super kan användas till anrop av en omdefinierad metod Super kan användas till anrop av konstruktorer i superklassen Super.
Föreläsning 12 Om slutprovet. Repetition –deklaration av variabler –skapande av objekt (instansiering) –Vektorer och Vector-klassen –Klasser –Instans-/klassvariabler.
OOP F14:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 14 Repetition Tips inför inlämningsuppgift 2.
Föreläsning 4 Klasser Och Objekt.
1 ITK:P2 F6 Sortering av generiska containerklasser DSV Peter Mozelius.
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
Räkna till en miljard 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,14,15,16,17,18,19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, En miljard är ett.
ITK:P1 Föreläsning 2 Introduktion till objektorientering DSV Marie Olsson.
Objektorienterad programmering
Arv repetition Arv = Är relation Tillgänglighet public, protected och private. Överklass ös Direkt härledd underklass dhu: Class dhu : public ös{} Indirekt.
Programmering i C# Laborationer.
7. Delegerare och notifierare
Föreläsning 17 Repetition. Källkodsformat Unicode används åäöμψζ tillåtna i namn på identifierare Inte alla miljöer klarar av det Källkod Bytekod Java.
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Föreläsning 5 Objekt Klasser Konstruktorer Metoder Minnesbilder av objekt.
Programmeringsteknik för K och Media
OOP - teori1 OOP del II– Föreläsning 5 vecka 6. OOP - teori2 Klasser Substantiv i singularis stavat med stor bokstav till exempel Human Dog Account Circle.
1 Föreläsning 6 Repetition på metoder Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
OOP&M - teori1 OOP del II– Föreläsning 2 vecka 46 Konstruktorer Instansmetoder Kapitel 14 i kursboken.
Malmö högskola Rolf Axelsson 2003/2004 DA7231, 4 poäng Referensvariabel Klass och konstruktorer Klass med set- och get-metoder Klass och fält Fler metoder.
Överlagring av operatorer, friends, user-defined conversions, klassmallar sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Överlagring av operatorer.
Arv, abstrakta klasser och gränssnitt
OOP&M - teori1 OOPM del II– Föreläsning vecka Mer om ärvning.. Abstrakta klasser/metoder Gränssnitt/Interface klasser.
OOP&M - teori1 OOPM del II – Föreläsning vecka Abstrakta klasser/metoder igen Gränssnitt/Interface klasser igen tillämpat.
Objektorienterad programmering sid. 1 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering.
TDP004 Objektorienterad Programmering Fö 6 Objektorientering forts.
TDP004 Objektorienterad Programmering Fö 8 Sammanfattning
Objektorienterad programmering forts
Presentationens avskrift:

4. Arv och dynamisk bindning Programmering i C# 4. Arv och dynamisk bindning

Arv Härledd klass ska representera något som är en sorts av det basklassen representerar Dimension som inte finns i funktionsorientering Ändrat beteende genom att lägga till ny kod – inte ändra i befintlig Arbetssätt som inte finns i funktionsorientering Härledd klass kan omdefiniera och utöka Endast en basklass kan förekomma Programmering i C# - Kapitel 4

Basklass class Shape { int x, y; // position public void Move(int x, int y) { this.x += x; this.y += y; } public double Area() { return 0.0; } } Programmering i C# - Kapitel 4

Härledd klass class Circle : Shape { int radius; public Circle(int radius) { this.radius = radius; } public new double Area() { return System.Math.PI * radius * radius; } public double Circumference() { return System.Math.PI * 2 * radius; } } Programmering i C# - Kapitel 4

Klientkod Shape shp = new Shape(); Console.WriteLine(shp.Area()); // alltid 0.0 Circle cle = new Circle(10); Console.WriteLine(cle.Area()); // 314.15... Härledd klass metoder och konstruktor kan ej nå koordinaterna! Är private i basklassen Programmering i C# - Kapitel 4

Synlighet public – synlig i egna metoder, i härledda klassers metoder och via objekt private – synlig endast i egna metoder protected – synlig i egna och härledda klassers metoder internal – som public, men endast mot klasser i samma assembly internal protected – kombination Programmering i C# - Kapitel 4

4.1 Arv kontra aggregering Arv ska endast användas i solklara fall Kom ihåg: en sorts! Vid tvekan använd aggregering Befintliga klassens logik återanvänds genom att ett objekt utgör medlem Poängen med arv är omdefinitioner och dynamisk bindning Programmering i C# - Kapitel 4

4.2 Konstruktorer och destruktor Allt ärvs – utom konstruktorer Utan konstruktoranrop skapas basklassdelen med sin klass defaultkonstruktor Basklasskonstruktor kan anropas från härledd klass konstruktor Gör den uppsättning konstruktorer som är relevant i härledda klassen! Programmering i C# - Kapitel 4

Konstruktorer exempel class Shape { int x, y; // position public Shape(int x, int y) // enda konstruktorn { this.x = x; this.y = y; } … Programmering i C# - Kapitel 4

Konstruktorer exempel forts. class Circle : Shape { int radius; public Circle(int x, int y, int radius): base(x, y) { this.radius = radius; } public Circle(int radius): base(0, 0) { this.radius = radius; } … Programmering i C# - Kapitel 4

Destruktorer Destruktor anropas automatiskt om sådan finns i aktuell klass eller någon basklass Basklassens destruktor först Kan inte anropas explicit Dispose i basklass bör anropas från härledd klass’ Dispose, om den finns Programmering i C# - Kapitel 4

4.3 Typomvandling Implicit uppåt – riskabel neråt Basklassreferens kan ha härlett objekt Aldrig tvärtom Shape shp = new Shape(100, 100); shp.Move(5, 5); // Shape-objektet flyttas shp = new Circle(100, 100, 50); shp.Move(5, 5); // Circle-objektet flyttas Programmering i C# - Kapitel 4

Två problem Om basklassreferens refererar till objekt av härledd klass, och: (1) anropad metod enbart finns i härledda klassen? (2) anropad metod är omdefinierad i härledda klassen? Programmering i C# - Kapitel 4

Downcast (1) Referensen måste typomvandlas till objektets typ Explicit typomvandling genererar undantag Använd is eller as if (shp is Circle) ((Circle)shp).Circumference(); // eller: Circle cle = shp as Circle; if (cle != null) cle.Circumference(); Programmering i C# - Kapitel 4

Virtuella metoder (2) Referensens typ avgör vilken klass’ metod som anropas Statisk bindning Oftast inte önskvärt – objektets typ bör avgöra val av metod Dynamisk bindning Metoden görs virtuell Programmering i C# - Kapitel 4

Virtuell metod, exempel class Shape { ... public double Area() { return 0.0: } } class Circle : Shape { ... public new double Area() { return System.Math.PI * radius * radius; } Programmering i C# - Kapitel 4

4.5 Abstrakta basklasser Om metoder ska kunna anropas måste de finnas i den basklass som är referensens typ Kan ofta inte implementeras i basklass Exempelvis Shape.Area() Lösning: gör metoden abstract Klassen blir då också abstrakt – objekt kan inte skapas Programmering i C# - Kapitel 4

Abstrakt klass forts. Abstrakt metod blir också virtuell abstract class Shape { ... public abstract double Area(); // override i härledd } Abstrakt metod blir också virtuell Även egenskaper kan göras abstrakta/virtuella Härledd klass som inte implementerar alla abstrakta basklassmetoder blir abstrakt Programmering i C# - Kapitel 4

4.6 Interface Ofta bra design samla enbart abstrakta metoder i egen klass Ger standardiserade interface Särskild syntax: interface Tredje kategorin datatyper av tre Får endast innehålla metoder, egenskaper, indexerare och notifierare Alla är alltid public Programmering i C# - Kapitel 4

Interface exempel interface IShape { void Move(int x, int y); double Area(); int SizeX { get; } int SizeY { get; } ... } Medlemmarna är inte virtuella och kan inte markeras virtual! Programmering i C# - Kapitel 4

Interface forts. Klass kan implementera flera interface Implementera == ärva Samtliga metoder måste implementeras Samtliga måste vara public, eller deklareras med interfacenamnet Blir då synliga endast via interfacereferens Programmering i C# - Kapitel 4

Dynamisk bindning från interface Metoder i interface är inte virtuella Klass som ärver klass som implementerar ett interface får inte dynamisk bindning Två lösningar: Återimplementera interfacet Mycket excentrisk språkmekanism Göra implementationerna virtual Programmering i C# - Kapitel 4

Återimplementera interfacet interface IA { void MA(); } class A : IA { public void MA() { ... } class B : A, IA // upprepad explicit implementation! { public new void MA() { ... } Programmering i C# - Kapitel 4

Gör implementationen virtuell interface IA { void MA(); } class A : IA { public virtual void MA() { ... } // virtuell här! class B : A { public override void MA() { ... } Programmering i C# - Kapitel 4

Standardinterface Interface standardiserar vanliga metoder eller grupper av metoder 19 standardinterface i biblioteket IDisposable med Dispose() ICloneable med Clone() IComparable med CompareTo() Programmering i C# - Kapitel 4

4.7 Arvet från Object Object är implicit basklass för alla typer Structer ärver indirekt via ValueType Har konstruktor – objekt kan skapas Sällsynta tillfällen Nio medlemmar varav tre är virtuella metoder som ofta omdefinieras ToString, GetHashCode och Equals Programmering i C# - Kapitel 4

Object public class Object { public Object() {...} ~Object() {...} public virtual string ToString() {...} public virtual int GetHashCode() {...} public virtual bool Equals(object obj) {...} public static bool Equals(object objA, object objB) {...} public static bool ReferenceEquals(object objA, object objB) {...} public Type GetType() {...} protected object MemberwiseClone() {...} } Programmering i C# - Kapitel 4

ToString Bör skapa sträng som beskriver objektet Medlemmars värden, eventuell ledtext Basklassversionen ger sträng med typnamnet Används av bl.a. Console.WriteLine Bra för spårutskrifter Kan vara användbart i användarinterface Programmering i C# - Kapitel 4

GetHashCode Bör returnera stort heltal beroende av objektets tillstånd Används av Hashtable Nödvändig om objekt ska läggas i Hashtable Hashtable kräver också omdefinierad Equals Basklassversionen returnerar referensens värde (minnesadress) – oanvändbar! Programmering i C# - Kapitel 4

Equals Två överlagrade: Virtuell instansmetod Statisk metod Instansmetoden bör omdefinieras då objekts tillstånd ska kunna jämföras Basklassversionen jämför referenserna Jämför alltså identitet, inte tillstånd Programmering i C# - Kapitel 4

Statiska Equals/ReferenceEquals Statiska Equals tar två object-referenser Kontrollerar om någon är null Kontrollerar om båda är lika Anropar annars instansmetoden Equals Statiska ReferenceEquals jämför alltid identitet Relevant om Equals omdefinierats Programmering i C# - Kapitel 4

Jämförelseoperatorerna Överlagring av == och != bör också ske om Equals omdefinierats Enkel implementation: anropa statiska Equals! public static bool operator==( MyClass objA, MyClass objB) { return Equals(objA, objB); } Programmering i C# - Kapitel 4

MemberwiseClone Omdefinieras inte Är en protected hjälpmetod för kopiering av objekt Kan användas för implementationen av ICloneable.Clone Ger ”shallow copy” – referenser kopieras Referenser bör tilldelas nytt objekt Programmering i C# - Kapitel 4