Använd vänsterpil och högerpil för att navigera
Eller Ctrl+P för att skriva ut till PDF (eller på papper)
Föreläsning 12
Arv (inheritance)
Gränssnitt för produkter
interface IProduct {
string Name { get; set; }
double Price { get; set; }
string Summary { get; }
}
Klasser som implementerar gränssnittet
class Milk : IProduct {
public string Name { get; set; }
public double Price { get; set; }
public double Fat { get; set; }
public string Summary {
get {
return Name + " has " + Fat + " percent fat";
}
}
}
class Car : IProduct {
public string Name { get; set; }
public double Price { get; set; }
public string Color { get; set; }
public string Summary {
get {
return Name + " is " + Color;
}
}
}
Användning av klasserna
Milk milk = new Milk {
Name = "Arla Standard",
Price = 8.5,
Fat = 3.0
};
Console.WriteLine(milk.summary);
Car car = new Car {
Name = "DeLorean",
Price = 2500000,
Color = "gray"
};
Console.WriteLine(car.summary);
Vad är gemensamt?
class Milk : IProduct {
public string Name { get; set; }
public double Price { get; set; }
public double Fat { get; set; }
public string Summary {
get {
return Name + " costs " + Price + " kr";
}
}
}
class Car : IProduct {
public string Name { get; set; }
public double Price { get; set; }
public string Color { get; set; }
public string Summary {
get {
return Name + " costs " + Price + " kr";
}
}
}
Gemensam klassmetod
class Milk : IProduct {
...
public string Summary {
get {
return ProductSummary(this);
}
}
}
class Car : IProduct {
...
public string Summary {
get {
return ProductSummary(this);
}
}
}
static string ProductSummary(IProduct p) {
return p.Name + " costs " + p.Price + " kr.";
}
Motsvarande kod med arv
class Product {
public string Name { get; set; }
public double Price { get; set; }
public string Summary {
get {
return Name + " costs " + Price + " kr.";
}
}
}
class Car : Product {
public string Color { get; set; }
}
class Milk : Product {
public string Fat { get; set; }
}
Hur klassen "egentligen" ser ut
class Car : Product {
public string Name { get; set; }
public double Price { get; set; }
public string Summary {
get {
return Name + " costs " + Price + " kr.";
}
}
public string Color { get; set; }
}
Fullständiga koden igen
class Product {
public string Name { get; set; }
public double Price { get; set; }
public string Summary {
get {
return Name + " costs " + Price + " kr.";
}
}
}
class Car : Product {
public string Color { get; set; }
}
class Milk : Product {
public string Fat { get; set; }
}
Problem med arv
En klass kan bara ärva från en (1) annan klass
Alternativet (multipelt arv) leder till helt nya problem (överkurs)
Ändringar i superklassen kan orsaka oförutsedda förändringar i subklasser
Tydligt först i större eller mer långlivade program
Varför använder vi arv?
I vissa fall förenklar det program utan att medföra risker
Det används i .NET för grafiska gränssnitt (GUI)
Arv i .NET
Fönster i GUI
class MyForm : Form {
public MyForm() {
Text = "This is my GUI";
Button button = new Button {
Text = "My Button"
};
Controls.Add(button);
}
}
Hur klassen "egentligen" ser ut
class MyForm : Form {
public string Text { get; set; }
public List<Control> Controls { get; set; }
...
public MyForm() {
Text = "This is my GUI";
Button button = new Button {
Text = "My Button"
};
Controls.Add(button);
}
}
Egna properties och metoder
class MyForm : Form {
public string Text { get; set; }
public List
Controls { get; set; }
...
public string CustomProperty1 { get; set; }
public string CustomProperty2 { get; set; }
public void CustomMethod() { ... }
public MyForm() {
Text = "This is my GUI";
Button button = new Button {
Text = "My Button"
};
Controls.Add(button);
}
}
Interaktivitet med händelser (events)
class MyForm : Form {
public MyForm() {
Text = "This is my GUI";
Button button = new Button {
Text = "My Button"
};
button.Click += OnButtonClick;
Controls.Add(button);
}
private void OnButtonClick(object sender, EventArgs e) {
MessageBox.Show("Hello!");
}
}