Difference between revisions of "Inheritance"

From TRCCompSci - AQA Computer Science
Jump to: navigation, search
(Inheritance)
 
(14 intermediate revisions by 3 users not shown)
Line 1: Line 1:
== Inheritance ==
+
==Simple Definition==
<syntaxhighlight lang="csharp">  
+
 
Class Animal{
+
When a class is used to create a subclass, the subclass inherits all of the data values and methods from the parent class.
  private int age;
+
 
  private string name;
+
<youtube>https://www.youtube.com/watch?v=oIU7GBse_yU&index=3&list=PLCiOXwirraUAJPwNTW5gxfJK6Ej18fDP9</youtube>
  private enum gender{
+
 
      Male,
+
https://www.youtube.com/watch?v=oIU7GBse_yU&index=3&list=PLCiOXwirraUAJPwNTW5gxfJK6Ej18fDP9
      female
+
 
    };
+
==Detailed Definition ==
  public Animal(){ //Class Constructor
+
Inheritance is the process by which code applying to a given class can be functionally reused by another class with minimal effort. S.N. any Class which inherits from another class possesses an 'IS A' relationship (counter to a 'HAS A' relationship). Inheritance is best explained via abstraction, for example if we abstract a Ferret into it's many sub components, we find a Ferret 'IS A' Mamal which 'IS A' Animal. Class abstraction can have numerous degrees of seperation and allows the implementation of inheritance functionality, namely allowing any class in the inheritance chain to become a parent to a new class; for example if we add another mamal to the chain such as tiger, we can have this new class inherit all the functionality of the class Mamal
      //some code to run when a new instance of the class is created
+
and allow it to posess the exact same base to define itself as we did for Feret.
  }
+
 
  public void Walk(){
+
== General Inheritance Example ==
      //some more code
+
To display the qualities &amp additional functionality available to a program which implements inheritance, we will create a short program displaying Animals.
  }
+
 
  public int Age{
+
<tabber>
      get{ return age; }
+
C#=
      set{ age = value; }
+
<syntaxhighlight lang="csharp" line>
  }
+
private enum EGender {
  public string Name{
+
  Male, female
      get{ return name; }
+
  // Enumeration containing
      set{ name = value; }
+
}; // possible gender values
  }
+
 
  public enum Gender{
+
class Animal {
      get{ return gender; }
+
    public Animal(name, age, gender) {
      set{ gender = value; }
+
        this.name = name;
  }
+
        this.age = age;
 +
        this.gender = gender;
 +
    }
 +
 
 +
    public void Output() {
 +
        Console.WriteLine("{0} Is a {1} & is {2} Years Old",
 +
            this.name, this.gender, this.age)
 +
    }
 +
 
 +
    private int _age;
 +
    private String _name;
 +
    private EGender _gender;
 +
 
 +
    public int age { get { return _age; } set { _age = value; } }
 +
    public String name { get { return _name; } set { _name = value; } }
 +
    public EGender gender { get { return _gender; } set { _gender = value; } }
 +
}
 +
 
 +
</syntaxhighlight>
 +
</tabber>
 +
 
 +
The above Animal class can act as a parent for all Animals you may create down the line, for example:
 +
 
 +
<tabber>
 +
C#=
 +
<syntaxhighlight lang="csharp" line>
 +
 
 +
class Tiger : Animal {
 +
    public Tiger(name, age, gender, numOfLegs) : base(name, age, gender) {
 +
      // S.N. the 'base' after the : calls the base constructor of the Parent Animal class
 +
        this.numOfLegs = numOfLegs;
 +
    }
 +
 
 +
    private int _numOfLegs;
 +
    public int numOfLegs { get { return _numOfLegs; } set { _numOfLegs = value; } }
 
}
 
}
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
</tabber>
 +
 +
The above Tiger class possesses all the same functions and code as the Animal class, but '''Builds''' on the Animal class by adding the instance property numOfLegs to the class and overrides the base constructor with a new constructor which calls the base constructor and then sets the new value restricted to the Tiger class (numOfLegs). The Good thing about this is that the Tiger Class can be given a new sibling by just creating a new class which also inherits from Animal, for example.
 +
 +
<tabber>
 +
C#=
 +
<syntaxhighlight lang="csharp" line>
 +
 +
class Eagle : Animal {
 +
    public Eagle(name, age, gender, numOfWings) : base(name, age, gender) {
 +
      // S.N. the 'base' after the : calls the base constructor of the Parent Animal class
 +
        this.numOfWings = numOfWings;
 +
    }
  
*Basic example class of a generic animal.
+
    private int _numOfWings;
<syntaxhighlight lang="csharp">
+
    public int numOfLegs { get { return _numOfWings; } set { _numOfWings; = value; } }
Class Mammal: Animal{
 
  private enum hairColour{
 
      White,
 
      Black,
 
      Brown,
 
      Other
 
  };
 
  public Mammal(){ //Class Constructor
 
      //some code to run when a new instance of the class is created
 
  }
 
  public override void Walk(){
 
      //Some different code
 
  }
 
  public enum HairColour{
 
      get{ return hairColour; }
 
      set{ hairColour = value; }
 
  }
 
 
}
 
}
</syntaxhighlight>  
+
 
*A new Mammal class that inherits all aspect of the Animal class e.g name or gender but also adds its own unique
+
</syntaxhighlight>
data type, hairColour. This data is not accessible to any objects created from the Animal class.
+
</tabber>
*Another thing inheritance allows you to do is override existing functions or data types. e.g.
+
 
in the Mammal class, the inherited function Walk() is being overridden meaning it can do something completely different  
+
Both Eagle & Tiger 'IS A' Animal, however Eagle 'IS NOT A' Tiger despite both being children of the class Animal. To make sure both Eagle & Tiger implement the functionality found in Animal, we can try to use the Output method in the parent class with instances of both children classes; for example:
to what it does in the Animal class.
+
 
 +
<tabber>
 +
C#=
 +
<syntaxhighlight lang="csharp" line>
 +
 
 +
 
 +
Tiger tiger = new Tiger("Atsushi", 17, EGender.Male); // New Instance of Tiger
 +
Eagle eagle = new Eagle("Torway", 14, EGender.Male); // New Instance of Eagle
 +
 
 +
tiger.Output(); // Call to base function in parent Animal
 +
// Outputs "Atsushi is a Male and is 17 Years old"
 +
 
 +
eagle.Output(); // Call to base function in parent Animal
 +
// Outputs "Torway is a Male and is 14 Years old"
 +
 
 +
</syntaxhighlight>
 +
</tabber>
 +
 
 +
For examples on how inheritance can be used to psuedo link different object instances to a given global class (allowing different, for example, Animals to all be contained in a single array despite being different types) view the examples on [[Array Downsides extended]].

Latest revision as of 13:06, 11 June 2018

Simple Definition

When a class is used to create a subclass, the subclass inherits all of the data values and methods from the parent class.

https://www.youtube.com/watch?v=oIU7GBse_yU&index=3&list=PLCiOXwirraUAJPwNTW5gxfJK6Ej18fDP9

Detailed Definition

Inheritance is the process by which code applying to a given class can be functionally reused by another class with minimal effort. S.N. any Class which inherits from another class possesses an 'IS A' relationship (counter to a 'HAS A' relationship). Inheritance is best explained via abstraction, for example if we abstract a Ferret into it's many sub components, we find a Ferret 'IS A' Mamal which 'IS A' Animal. Class abstraction can have numerous degrees of seperation and allows the implementation of inheritance functionality, namely allowing any class in the inheritance chain to become a parent to a new class; for example if we add another mamal to the chain such as tiger, we can have this new class inherit all the functionality of the class Mamal and allow it to posess the exact same base to define itself as we did for Feret.

General Inheritance Example

To display the qualities &amp additional functionality available to a program which implements inheritance, we will create a short program displaying Animals.

 1 private enum EGender {
 2   Male, female
 3   // Enumeration containing
 4 }; // possible gender values
 5 
 6 class Animal {
 7     public Animal(name, age, gender) {
 8         this.name = name; 
 9         this.age = age;
10         this.gender = gender;
11     }
12 
13     public void Output() {
14         Console.WriteLine("{0} Is a {1} & is {2} Years Old",
15             this.name, this.gender, this.age)
16     }
17 
18     private int _age;
19     private String _name;
20     private EGender _gender;
21 
22     public int age { get { return _age; } set { _age = value; } }
23     public String name { get { return _name; } set { _name = value; } }
24     public EGender gender { get { return _gender; } set { _gender = value; } }
25 }

The above Animal class can act as a parent for all Animals you may create down the line, for example:

1 class Tiger : Animal {
2     public Tiger(name, age, gender, numOfLegs) : base(name, age, gender) {
3        // S.N. the 'base' after the : calls the base constructor of the Parent Animal class
4         this.numOfLegs = numOfLegs;
5     }
6 
7     private int _numOfLegs;
8     public int numOfLegs { get { return _numOfLegs; } set { _numOfLegs = value; } }
9 }

The above Tiger class possesses all the same functions and code as the Animal class, but Builds on the Animal class by adding the instance property numOfLegs to the class and overrides the base constructor with a new constructor which calls the base constructor and then sets the new value restricted to the Tiger class (numOfLegs). The Good thing about this is that the Tiger Class can be given a new sibling by just creating a new class which also inherits from Animal, for example.

1 class Eagle : Animal {
2     public Eagle(name, age, gender, numOfWings) : base(name, age, gender) {
3        // S.N. the 'base' after the : calls the base constructor of the Parent Animal class
4         this.numOfWings = numOfWings;
5     }
6 
7     private int _numOfWings;
8     public int numOfLegs { get { return _numOfWings; } set { _numOfWings; = value; } }
9 }

Both Eagle & Tiger 'IS A' Animal, however Eagle 'IS NOT A' Tiger despite both being children of the class Animal. To make sure both Eagle & Tiger implement the functionality found in Animal, we can try to use the Output method in the parent class with instances of both children classes; for example:

1 Tiger tiger = new Tiger("Atsushi", 17, EGender.Male); // New Instance of Tiger
2 Eagle eagle = new Eagle("Torway", 14, EGender.Male); // New Instance of Eagle
3 
4 tiger.Output(); // Call to base function in parent Animal
5 // Outputs "Atsushi is a Male and is 17 Years old"
6 
7 eagle.Output(); // Call to base function in parent Animal
8 // Outputs "Torway is a Male and is 14 Years old"

For examples on how inheritance can be used to psuedo link different object instances to a given global class (allowing different, for example, Animals to all be contained in a single array despite being different types) view the examples on Array Downsides extended.