5. A Class
• Let’s create a Player
• And a Constructor
class Player
{
private string name;
private int score;
private int livesLeft;
}
class Player
{
private string name;
private int score;
private int livesLeft;
public Player(string name)
{
this.name = name;
}
public Player(string name, int startingLives)
{
this.name = name;
livesLeft = startingLives;
}
}
11. this Keyword Usage
• Name hiding and clarity
• Passing Player instance at runtime to other object.
• Cloning the Player object (instance at runtime) into another Player object (in
constructor.)
public Player(string name)
{
this.name = name;
}
public Player(string name, int startingLives)
{
this.name = name;
livesLeft = startingLives;
}
14. Destructor
• Correspond to finalizers in Java.
• Called for an object before it is removed by the garbage collector.
• No public or private.
• Is dangerous (object resurrection) and should be avoided
class Test
{
~Test()
{
... finalization work ...
// automatically calls the destructor of the base class
}
}
17. using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}
Inheritance
18. using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}
Inheritance
19. using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}
Inheritance
20. using System;
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}
Parent Constructor.
Child Constructor.
I'm a Parent Class.
Inheritance
21. public class Parent
{
string parentString;
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Child : Parent
{
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}
Inheritance
22. public class Parent
{
string parentString;
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Child : Parent
{
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}
Inheritance
23. public class Parent
{
string parentString;
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Child : Parent
{
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}
From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.
Inheritance
25. public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine(
"I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
Polymorphism
26. public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine(
"I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
Polymorphism
27. public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine(
"I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
Polymorphism
28. class Program
{
static void Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4];
dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject();
foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}
}
}
Polymorphism
29. class Program
{
static void Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4];
dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject();
foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}
}
}
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
Press any key to continue...
Polymorphism
30. public class DrawingObject
{
public DrawingObject(string objectName)
{
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
31. public class DrawingObject
{
public DrawingObject(string objectName)
{
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
32. public class DrawingObject
{
public DrawingObject(string objectName)
{
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
33. public class DrawingObject
{
public DrawingObject(string objectName)
{
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
34. public class DrawingObject
{
public DrawingObject(string objectName)
{
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
38. public class DrawingObject
{
public DrawingObject(string objectName)
{
Console.WriteLine(objectName);
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing
object.");
}
}
public class Line : DrawingObject
{
public Line():base("ForBaseClass,
DrawingObject")
{
Console.WriteLine(this.ToString());
}
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
39. public class DrawingObject
{
public DrawingObject(string objectName)
{
Console.WriteLine(objectName);
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing
object.");
}
}
public class Line : DrawingObject
{
public Line():base("ForBaseClass,
DrawingObject")
{
Console.WriteLine(this.ToString());
}
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
40. public class DrawingObject
{
public DrawingObject(string objectName)
{
Console.WriteLine(objectName);
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing
object.");
}
}
public class Line : DrawingObject
{
public Line():base("ForBaseClass,
DrawingObject")
{
Console.WriteLine(this.ToString());
}
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
ForBaseClass, DrawingObject
ConsoleApplicationCourseTest.Line
Press any key to continue...
Polymorphism
41. public class DrawingObject
{
public DrawingObject(string objectName)
{
Console.WriteLine(objectName);
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing
object.");
}
}
public class Line : DrawingObject
{
public Line():base("ForBaseClass,
DrawingObject")
{
Console.WriteLine(this.ToString());
}
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
ForBaseClass, DrawingObject
ConsoleApplicationCourseTest.Line
Press any key to continue...
Polymorphism
42. public class DrawingObject
{
public DrawingObject(string objectName)
{
Console.WriteLine(objectName);
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing
object.");
}
}
public class Line : DrawingObject
{
public Line():base("ForBaseClass,
DrawingObject")
{
Console.WriteLine(this.ToString());
}
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
ForBaseClass, DrawingObject
ConsoleApplicationCourseTest.Line
Press any key to continue...
Polymorphism
45. public class DrawingObject
{
public DrawingObject(string objectName)
{
Console.WriteLine(objectName);
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing
object.");
}
}
public class Line : DrawingObject
{
public Line():base("ForBaseClass,
DrawingObject")
{
Console.WriteLine(this.ToString());
}
public override string ToString()
{
return "just another Line object on runtime!";
}
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Polymorphism
46. public class DrawingObject
{
public DrawingObject(string objectName)
{
Console.WriteLine(objectName);
}
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing
object.");
}
}
public class Line : DrawingObject
{
public Line():base("ForBaseClass,
DrawingObject")
{
Console.WriteLine(this.ToString());
}
public override string ToString()
{
return "just another Line object on runtime!";
}
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
ForBaseClass, DrawingObject
just another Line object on runtime!
Press any key to continue...
Polymorphism
48. Abstract Classes
• Abstract methods do not have an implementation.
• Abstract methods are implicitly virtual.
• If a class has abstract methods it must be declared abstract itself.
• One cannot create objects of an abstract class.
abstract class Stream
{
public abstract void Write(char ch);
public void WriteString(string s) { foreach (char ch in s) Write(s); }
}
class File: Stream
{
public override void Write(char ch) {... write ch to disk...}
}
49. sealed and internal classes
sealed: can’t be extended (Java’s final)
internal: can’t be used in other namespaces
51. class DerivedClass: BaseClass
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
DerivedClassmD = new MyDerived();
BaseClass mB = (BaseClass)mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
Versioning
public class BaseClass
{
public virtual string Meth1()
{
return "BaseClass-Meth1";
}
public virtual string Meth2()
{
return "BaseClass-Meth2";
}
public virtual string Meth3()
{
return "BaseClass-Meth3";
}
}
52. class DerivedClass: BaseClass
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
DerivedClassmD = new MyDerived();
BaseClass mB = (BaseClass)mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
Versioning
Overrides the virtual method
Meth1 using the override
keyword
public class BaseClass
{
public virtual string Meth1()
{
return "BaseClass-Meth1";
}
public virtual string Meth2()
{
return "BaseClass-Meth2";
}
public virtual string Meth3()
{
return "BaseClass-Meth3";
}
}
53. class DerivedClass: BaseClass
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
DerivedClassmD = new MyDerived();
BaseClass mB = (BaseClass)mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
Versioning
Explicitly hide the virtual
method Meth2 using the new
keyword
public class BaseClass
{
public virtual string Meth1()
{
return "BaseClass-Meth1";
}
public virtual string Meth2()
{
return "BaseClass-Meth2";
}
public virtual string Meth3()
{
return "BaseClass-Meth3";
}
}
54. class DerivedClass: BaseClass
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
DerivedClassmD = new MyDerived();
BaseClass mB = (BaseClass)mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
Versioning
Because no keyword is specified
in the following declaration a
warning will be issued to alert
the programmer that the method
hides the inherited member
BaseClass.Meth3()
public class BaseClass
{
public virtual string Meth1()
{
return "BaseClass-Meth1";
}
public virtual string Meth2()
{
return "BaseClass-Meth2";
}
public virtual string Meth3()
{
return "BaseClass-Meth3";
}
}
55. class DerivedClass: BaseClass
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
DerivedClassmD = new MyDerived();
BaseClass mB = (BaseClass)mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
Versioning
public class BaseClass
{
public virtual string Meth1()
{
return "BaseClass-Meth1";
}
public virtual string Meth2()
{
return "BaseClass-Meth2";
}
public virtual string Meth3()
{
return "BaseClass-Meth3";
}
}
MyDerived-Meth1
BaseClass-Meth2
BaseClass-Meth3
64. Interfaces
• An interface contains only the signatures of methods, delegates or events.
• The implementation of the methods is done in the class that implements the
interface.
• Can’t contain Fields!
66. Consider a Human, an Animal and a Car Class, where they all implement a crazy method called
ConsumeWater().
If we have many objects of each type of Human, Animal and Car and we want to call
ConsumeWater() for all objects of Human, Animal and Car; we have to call it like this:
human1.ConsumeWater();
human2.ConsumeWater();
human3.ConsumeWater();
animal1.ConsumeWater();
animal2.ConsumeWater();
car1.ConsumeWater();
car2.ConsumeWater();
68. SomeObject
Human Animal Car
And they they can’t be subclassed from one particular abstract/base class like this:
Because they are not the same and they share some common properties!
69. If we have many objects of each type of Human, Animal and Car and we want to call
ConsumeWater() for all objects of Human, Animal and Car; we have to call it like this:
human1.ConsumeWater();
human2.ConsumeWater();
human3.ConsumeWater();
animal1.ConsumeWater();
animal2.ConsumeWater();
car1.ConsumeWater();
car2.ConsumeWater();
But if we can implement a common functionalities from a common place, that would be nice!
interface
Human Animal Car
Implementation
and not
inheritance!
70. If we have many objects of each type of Human, Animal and Car and we want to call
ConsumeWater() for all objects of Human, Animal and Car; we have to call it like this:
human1.ConsumeWater();
human2.ConsumeWater();
human3.ConsumeWater();
animal1.ConsumeWater();
animal2.ConsumeWater();
car1.ConsumeWater();
car2.ConsumeWater();
But if we can implement a common functionalities from a common place, that would be nice!
IWaterable
Human Animal Car
Implementation
and not
inheritance!
71. Now we can add all objects to a common list of IWaterable and just call ConsumeWater()
for each IWaterable object (they are all Waterable now!)
List<IWaterable> waterables = new List<IWaterable>() {“human1”, “human2”, “human3”,
“animal1”, “animal2”, “car1”, “car2”};
foreach(IWaterable waterable in waterables)
waterable.ConsumeWater();
Look how nice the code is and how clear the relation is. When we implement an interface we are
just saying that this interface provides a certain functionality for us (and others may freely have this
functionality as well.)
IWaterable
Human Animal Car
Implementation
and not
inheritance!
73. Interfaces – the Code
Public interface IWaterable
{
public void ConsumeWater();
}
74. Interfaces – the Code
Public interface IWaterable
{
public void ConsumeWater();
}
Public class Human: IWaterable
{
public void ConsumeWater()
{
}
}
Public class Animal: IWaterable
{
public void ConsumeWater()
{
}
}
Public class Car: IWaterable
{
public void ConsumeWater()
{
}
}
75. Interfaces – the Code
Public interface IWaterable
{
public void ConsumeWater();
}
Public class Human: IWaterable
{
public void ConsumeWater()
{
}
}
Public class Animal: IWaterable
{
public void ConsumeWater()
{
}
}
Public class Car: IWaterable
{
public void ConsumeWater()
{
}
}
76. Interfaces – the Code
Public interface IWaterable
{
public void ConsumeWater();
}
Public class Human: IWaterable
{
public void ConsumeWater()
{
//Drinking Water
}
}
Public class Animal: IWaterable
{
public void ConsumeWater()
{
//Drinking Water
}
}
Public class Car: IWaterable
{
public void ConsumeWater()
{
//Cooling the engine
}
}
77. Interfaces – the Code
Public interface IWaterable
{
public void ConsumeWater();
}
Public class Human: IWaterable
{
public void ConsumeWater()
{
//Drinking Water
}
}
Public class Animal:IWaterable,
INosiable
{
public void ConsumeWater()
{
//Drinking Water
}
public void MakeNoise()
{
//Mew, Roar or Moo!
}
}
Public class Car: IWaterable,
INosiable
{
public void ConsumeWater()
{
//Cooling the engine
}
public void MakeNoise()
{
//Rev the engine!
}
}
Public interface INoisable
{
public void MakeNoise();
}
78. Interfaces
• An interface can be a member of a namespace or a class and can contain
signatures of the following members:
– Methods
– Properties
– Indexers
– Events
• “No” Fields!
80. using System;
class Program
{
static void Main()
{
float lengthFloat = 7.35f;
// lose precision - explicit conversion
int lengthInt = (int)lengthFloat;
// no problem - implicit conversion
double lengthDouble = lengthInt;
Console.WriteLine("lengthInt = " + lengthInt);
Console.WriteLine("lengthDouble = " + lengthDouble);
Console.ReadKey();
}
}
Reference VS Value Types
81. using System;
class Program
{
static void Main()
{
float lengthFloat = 7.35f;
// lose precision - explicit conversion
int lengthInt = (int)lengthFloat;
// no problem - implicit conversion
double lengthDouble = lengthInt;
Console.WriteLine("lengthInt = " + lengthInt);
Console.WriteLine("lengthDouble = " + lengthDouble);
Console.ReadKey();
}
}
lengthInt = 7
lengthDouble = 7
Reference VS Value Types
82. Reference VS Value Types
• Reference type
• variables are named appropriately (reference) because the variable holds a reference to an
object.
• In C and C++, we have something similar that which is “a pointer”, which points to an object.
While you can modify a pointer, you can't modify the value of a reference - it simply points at
the object in memory.
84. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
85. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Original Employee Values:
joe = Joe
bob = Bob
Values After Reference Assignment:
joe = Joe
bob = Joe
Values After Changing One Instance:
joe = Bobbi Jo
bob = Bobbi Jo
86. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Original Employee Values:
joe = Joe
bob = Bob
Values After Reference Assignment:
joe = Joe
bob = Joe
Values After Changing One Instance:
joe = Bobbi Jo
bob = Bobbi Jo
How is that?!
87. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp Emp
joe bob
88. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp Emp
joe bob
89. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp Emp
joe bob
90. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp Emp
joe bob
91. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp Emp
joe bob
92. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp
joe
Emp
bob
93. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp
joe
Emp
bob
94. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp
joe
Emp
bob
95. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
Emp
joe bob
96. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
joe bob
Emp
Name =
“Joe”
97. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
joe bob
Emp
Name =
“Bobbi Jo”
98. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
joe bob
Emp
Name =
“Bobbi Jo”
99. Reference Types
class Program
{ static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
joe bob
Emp
Name =
“Bobbi Jo”
Original Employee Values:
joe = Joe
bob = Bob
Values After Reference Assignment:
joe = Joe
bob = Joe
Values After Changing One Instance:
joe = Bobbi Jo
bob = Bobbi Jo
100. Reference Types
• The following types are reference types:
• arrays
• class
• delegates
• interfaces
102. Value Types
• A value type
– variable holds its own copy of an object and when you perform assignment from one value
type variable to another, both the left-hand-side and right-hand-side of the assignment hold
two separate copies of that value.
103. Value Types
• A value type
– variable holds its own copy of an object and when you perform assignment from one value
type variable to another, both the left-hand-side and right-hand-side of the assignment hold
two separate copies of that value.
• An important fact you need to understand is that when you are assigning one
reference type variable to another, only the reference is copied, not the
object. The variable holds the reference and that is what is being copied.
104. struct Height
{
private int m_inches;
public int Inches
{
get { return m_inches; }
set { m_inches = value; }
}
}
Value Types
105. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
106. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
Height Height
joe bob
107. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
Height Height
joe bob
108. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
Height Height
joe bob
Height
109. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
Height Height
joe bob
Exactly
the
same
110. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
71 71
joe bob
Exactly
the
same
111. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
71 71
joe bob
112. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
65 71
joe bob
113. class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
bob = joe;
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
Value Types
65 71
joe bob
Original Height Values:
joe = 71
bob = 59
Values After Value Assignment:
joe = 71
bob = 71
Values After Changing One Instance:
joe = 65
bob = 71
115. Classes and Structs
Classes
• Reference Types
• (objects stored on the heap)
• support inheritance
• (all classes are derived from object)
• can implement interfaces
• may have a destructor
Structs
• Value Types
• (objects stored on the stack)
• no inheritance
• (but compatible with object)
• can implement interfaces
• no destructors allowed
120. The Principles
• Single Responsibility Principle: design your classes so that each has a single purpose
• Open / Closed Principle: Open for extension but closed for modification
• Liskov Substitution Principle (LSP): functions that use pointers or references to base classes must be
able to use objects of derived classes without knowing it
• Interface Segregation Principle (ISP): clients should not be forced to depend upon interfaces that they
do not use.
• Dependency Inversion Principle (DIP): high level modules should not depend upon low level modules.
Both should depend upon abstractions.
abstractions should not depend upon details. Details should depend upon abstractions.
121. is the process of validating the correctness of a small section of code. The target code may be a method within
a class, a group of members or even entire components that are isolated from all or most of their dependencies.
122.
123. Question #1
public class BaseClass
{
public virtual string Meth1()
{
return "BaseClass-Meth1";
}
public string Meth2()
{
return "BaseClass-Meth2";
}
public virtual string Meth3()
{
return "BaseClass-Meth3";
}
}
class DerivedClass: BaseClass
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
DerivedClassmD = new MyDerived();
BaseClass mB = mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
124. Question #1
public class BaseClass
{
public virtual string Meth1()
{
return "BaseClass-Meth1";
}
public string Meth2()
{
return "BaseClass-Meth2";
}
public virtual string Meth3()
{
return "BaseClass-Meth3";
}
}
class DerivedClass: BaseClass
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
DerivedClassmD = new MyDerived();
BaseClass mB = mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
MyDerived-Meth1
BaseClass-Meth2
BaseClass-Meth3
Press any key to continue...
125. Question #2
class Class1 { }
class Class2 : Class1{ }
class Class3 { }
public class TestingClass
{
public static void Test(object o)
{
Class1 a;
Class2 b;
Class3 c;
if (o is Class1)
{
Console.WriteLine("obj is Class1");
a = (Class1)o;
}
else if (o is Class2)
{
Console.WriteLine("obj is Class2");
b = (Class2)o;
}
else if (o is Class3)
{
Console.WriteLine("obj is Class3");
c = (Class3)o;
}
else if((Class3)o!= null)
{}
}
public static void Main()
{
try
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Class3 c3 = new Class3();
Test(c1);
Test(c2);
Test(c3);
Test("a string");
}
catch(Exception e)
{
Console.WriteLine("Sth wrong happened!");
}
}
}
126. Question #2
class Class1 { }
class Class2 : Class1{ }
class Class3 { }
public class TestingClass
{
public static void Test(object o)
{
Class1 a;
Class2 b;
Class3 c;
if (o is Class1)
{
Console.WriteLine("obj is Class1");
a = (Class1)o;
}
else if (o is Class2)
{
Console.WriteLine("obj is Class2");
b = (Class2)o;
}
else if (o is Class3)
{
Console.WriteLine("obj is Class3");
c = (Class3)o;
}
else if((Class3)o!= null)
{}
}
public static void Main()
{
try
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Class3 c3 = new Class3();
Test(c1);
Test(c2);
Test(c3);
Test("a string");
}
catch(Exception e)
{
Console.WriteLine("Sth wrong happened!");
}
}
}
obj is Class1
obj is Class1
obj is Class3
Sth wrong happened!
Press any key to continue...
127. public interface IsBaseTest
{
void Point1(object obj);
}
public class IsTest
{
public static void Point1(object obj)
{
Console.WriteLine(obj.ToString());
Point2("That's the point");
}
public static void Point2(string str)
{
Console.WriteLine(str.ToString());
Point3("That's the point");
}
public static void Point3(object obj)
{
if (obj.ToString() == " Passed String")
{
Console.WriteLine("In Point3");
}
}
public static void Main()
{
Point1("Passed String");
}
}
Question #3
128. public interface IsBaseTest
{
void Point1(object obj);
}
public class IsTest
{
public static void Point1(object obj)
{
Console.WriteLine(obj.ToString());
Point2("That's the point");
}
public static void Point2(string str)
{
Console.WriteLine(str.ToString());
Point3("That's the point");
}
public static void Point3(object obj)
{
if (obj.ToString() == " Passed String")
{
Console.WriteLine("In Point3");
}
}
public static void Main()
{
Point1("Passed String");
}
}
Question #3
Passed String
That's the point
In Point3
Press any key to continue...