App Develop Week 8 notes

Date: Tuesday March 4th

Topics Covered:

  • Constructors

  • Destructors

  • Partial Classes

  • Pillars of OOP

  • Solid

  • Software Installation (UML)

Recap: Constructors

What’s the point of a constructor?

  • Tells you to how set the parameters for an object

Constructor w/ Parameters v.s. Constructor w/o Parameters

  • A constructor w/ parameters —>

  • A constructor w/o parameters

Sample Code 1a: Uses a parameter-less constructor (see comment in code)

namespace Week8Lec1ConstructorRecap
{
class Cat
{
private string name; //Encapsulated (aka)
private double weight;
}
public void setName(string name)
{
this.name = name;
}
public string getName()
{

}
public void setWeight(double weight)
{
this.weight = weight;
}

internal class Program
{
static void Main(string[] args)
{
Cat c = new Cat() //parameter-less constructor
c.setName("Joe");
c.setWeight(10);

Console.WriteLine($"{c.getName()} weights {c.getWeight()} 1lbs");

Console.Read();
}
}
}

Sample 1b Code: The constructor in this code does have parameters

namespace Week8
{
class Cat
{
private string name; //Encapsulated (aka)
private double weight;
}
public void setName(string name)
{
this.name = name;
}
public string getName()
{

}
public void setWeight(double weight)
{
this.weight = weight;
}

internal class Program
{
static void Main(string[] args)
{
//Constructor w/ 2 parameters
Cat c;
c = new Cat();

Cat c2;
c2 = new Cat("George", 12);
c.setName("Joe");
c.setWeight(10);

Console.WriteLine($"{c.getName()} weights {c.getWeight()} 1lbs");
Console.WriteLine($"{c2.getName()} weights {c2.getWeight()} 1lbs");

Console.Read();
}
}
}

Destructors

Sample Code 1a: Using Destructors

namespace Week8Lec1Destructors
{
internal class Person
{
static void Main(string[] args)
{
Person pA = new Person("Fred", "Jones");
Person pB = new Person("Scooby", "Do");
pB = null;
//GC.Collect(); <--- Forces garbage collector to free up memory from the heap (NTS: un-comment this line to see its effect on code)

Console.ReadLine();
}
private string firstName;
private string lastName;

public Person(string firstName, string lastName)
{
//Constructor
this.firstName = firstName;
this.lastName = lastName;
}

// The following is a destructor
// Some coders choose to use more often than others (*prof said he rarely uses it)
// Automatically invoked whenever an object is freed from memory
// Using a destructor = Making choice to explicitly free up memory space
~Person() {

Console.WriteLine(firstName + " " + lastName);
Console.WriteLine("Taking out the trash");
}
}
}

Output —> should be nothing/empty

scooby doo

taking out the trash

Sample Code 1b: Same as sample code 1a, but the line starting w/ GC.Collection():

namespace Week8Lec1Destructors
{
internal class Person
{
static void Main(string[] args)
{
Person pA = new Person("Fred", "Jones");
Person pB = new Person("Scooby", "Do");
pB = null;
GC.Collect(); <--- Forces garbage collector to free up memory from the heap (NTS: un-comment this line to see its effect on code)

Console.ReadLine();
}
private string firstName;
private string lastName;

public Person(string firstName, string lastName)
{
//Constructor
this.firstName = firstName;
this.lastName = lastName;
}

// The following is a destructor
// Some coders choose to use more often than others (*prof said he rarely uses it)
// Automatically invoked whenever an object is freed from memory
// Using a destructor = Making choice to explicitly free up memory space
~Person() {

Console.WriteLine(firstName + " " + lastName);
Console.WriteLine("Taking out the trash");
}
}
}

Output is:

Scooby Doo

Taking out the trash

Pillars of OOP

**This will be asked on final exam

  1. Inheritance (DRY)

  2. Abstract Classes (enforce certain behaviors)

  3. Interfaces (enforce certain behaviors)

  4. Polymorphism (powerful)

*Remember: Abstraction ≠ Abstract Classes

**Must know definition of abstraction for final exam

Inheritance (a pillar of OOP)

DRY = Don’t Repeat Yourself

  • Code reuse —> beneficial for cutting down amount of code writing you actually do (DC if my explanation is correct)

class Student {
int ID;
string name;
string DOB;
string citizenship;
string gender;
}

class Employee {
int ID;
string name;
string DOB;
string citizenship;
string gender;
}

class Athelete{
int ID;
string name;
string DOB;
string citizenship;
string gender;
}

// Notice that all 3 classes contain the same variables, therefore you are repeating the same code. This does not make for good code. To fix this, create a parent class that each of these classes inherit from (they are the child classes).
class Person {
int ID;
string name;
string DOB;
string citizenship;
string gender;
}

class Student: Person{
double GPA;
//Class Student has all the same variables & methods as its parent class Person does, but also has the variable 'GPA'
}

class Employee: Person{
double salary;
}

class Athlete: Person{
string sport;
}
// Now our code has been improved so that class Person is the parent class & classes student, emplyoee, and athlete are its subclasses (therefore inherit all of its variables & methods). However, it's important to note

All classes inherit from the class Object

Which programming languages allow a class to have multiple parent classes?

  • C++

Which programming languages don’t allow a class to have multiple parent classes?

  • C#

  • Java

Class A ← Class B ← Class C

  • Above is an example of multi-level inheritance where Class B inherits from Class A, class C inherits from Class B & Class A

  • Muilti-level inheritance isn’t permitted in C#

Interfaces (a pillar of OOP)

Sample Code of Interfaces being used:

interface A{
int doCalculation();
int doCalculation2(int x, int y);
}

class XYZ: interfaceA

int doCalculation()
{
return 0;
}

int do Calculation(int x, int y)
{
return x + y;
}

Abstract Classes (a pillar of OOP)

namespace Week8_Lec1_OOP_Basics
{
abstract class AbstractClass1
{
puublic void print() //Concrete method
{
Console.WriteLine("Hello there");
}
public abstract void personsays(); //Abstract method
}

internal interface Interface1
{
// No implementation, whoever uses interface 1 will provide the implementation
void DoStuff(); //declares a method belonging to class AbstracClass1
void DoStuff2(); //declares another method
}

internal interface Interface2
{
void DoStuff3() //declares a method belong to class AbstractClass1
}
internal class Person:AbstractClass1, Interface1, Interface2
{
//All of the abstract methods belong to AbstractClass1 is implemented below
public override void personsays()
{
Console.WriteLine("I am a human");
}
public void DoStuff()
{
Console.WriteLine("I am reading");
}
public void DoStuff2()
{
Console.WriteLine("I am eating");
}
}
class Program
{
Person person = new Person()
person.DoStuff =
person.DoStuff2 =
person.DoStuff3 =
}
}

OOP Basics

  • 'sealed' is a keyword used to declare that a class cannot have children (subclasses)

If you want a child class to be modify a parent method…

  • Use the keyword ‘virtual’ within the parent class

  • Use the keyword ‘override’ within the child class

namespace Week8_Lec1_OOP_Basics
{
class Animal
{
public string type = "animal";

public void Greet()
{
Console.WriteLine("Hello I am an animal");
}
internal class Dog: Animal
{
public string type = "doberman";

// Keyword 'override' used in child class to override parent class method
public override void Greet()
{
base.Greet();
//'base' means you are referring to the Greet() in the parent class
Console.WriteLine("Referring to the dog class " + type);
//Refers to the version of the method in child class
Console.WriteLine("Referring to the Animal class " + base.type);
}
}
internal class Cat: Animal
{
public string type = "calico";

}
internal class Program
{
static void Main(string[] args)
{
Animal a = new Animal();
Dog dog = new Dog();
Cat c = new Cat();

a.Greet();
dog.Greet();
c.Greet();

Console.Read();
}
}
}
}

/* OUTPUT
Hello I am an animal
Hello, I am doberman!
Hello I am an animal
Referring to the dog class: doberman
Referring to the Animal class: animal
hello, I am a tabby! */

robot