繼承
繼承是物件導向一個很重要的特性,我們可以想像它是一種階層式的關係,如下所建,子類別(Child Class)會繼承父類別(Parent Class)所擁有的方法(Method)與屬性(Property)。例如: 父類別為筆,筆的屬性有名稱、價錢、外型和顏色。當我們要生產毛筆時,我們可以繼承這個父類別加入子類別自我的屬性:- 繼承的優點 :
1.容易達成軟體再利用(Software reuse),並減少相同功能的重覆開發。
2.可透過繼承的方式來擴充原有類別的功能。
繼承語法 |
---|
class subClass : parentClass{
// program
}
|
繼承的限制
- 子類別只可以繼承一個父類別
- 父類別繼承最上層的System.Object
- 子類別一定會呼叫父類別的建構子(如果沒有指定呼叫的建構子,會呼叫預設的建構子)
class parentClass{
public parentClass(string name)
{
//建構子
}
}
class subClass : parentClass{
public subClass(string name) : base(name) // call parent constructor
{
}
}
class subClass2 : parentClass{
public subClass2 (string name) //沒有指定呼叫建構子,預定會呼叫有預設的建構子
{
}
}
例子: 假設動物類別(animal)為所有的生物的父類別,底下有兩個子類別分別為鳥(bird)和狗(dog)
現在我們
class Animal{
public String skill ;
public String attribute;
//建構子
public Animal()
{
}
//建構子
public Animal( string skill , string attribute)
{
this.skill = skill ;
this.attribute = attribute;
}
}
class Bird: Animal{
public Bird(string skill , string attribute) : base(skill , attribute)
{
}
}
class Dog: Animal{
public Dog string skill , string attribute) : base(skill , attribute)
{
}
}
- 檢查運算子 : is 運算子、as運算子或是轉型
1.is運算子
2.as運算子:
用來檢查物件是否為該類別所有,檢查可以就指派給它,不可以就給它null。
Ex: Animal animal = new Animal() ;
Dog myDog = animal as Animal() ; //OK 將myDog 指定為Animal()
3.
- 宣告虛擬方法
我們知道子類別可以定義自己的方法,但是如果當我們規劃子類別的方法與父類別重複時,你要如何解決,在C#程式語言中,會預先在父類別定義virtual的方法,子類別利用override關鍵字來覆蓋或是替代之前的方法。
規則:
- private修飾詞不可以覆蓋
- 覆蓋時,名稱、參數與傳回值應該相同
- 使用的修飾詞也要相同,當父類別使用public時,子類別也要使用public。
- 沒有利用override關鍵字來覆蓋會出現警告,但是可以利用new來使編譯器略過
EX:
class Animal{
public String skill ;
public String attribute;
//建構子
public Animal()
{
}
public virtual string GetSkill()
{
}
}
class Bird: Animal{
public override string GetSkill() //覆蓋子類別的方法
{
}
}
介面
- 定義介面
介面是一個很抽象的類別,但是良好的系統設計都會利用介面來完成特定的工作,它很像一個契約,實作它的人必須要造它的規定實作該介面。主要是規劃如何做和做甚麼兩個目標。在系統規劃上也可以是用來定義不同種類的物件中,針對某種特性,所需要具備的相同功能
宣告介面:
interface IComparable{
int CompareTo(object obj) ; //介面方法
}
介面的限制:
- 介面不能定義任何欄位,靜態也不可以
- 介面沒有建構子/解建構子
- 介面的修飾詞只有為public,不能用private或是其他
- 介面只可以繼承介面。
實作介面
class Compared : IComparable {
//實作介面方法
int IComparable.CompareTo(){
}
}
實作多介面
class Compared : IComparable,IBound {
//實作介面方法
int IComparable.CompareTo(){
}
}
- 密封類別(sealed class)
密封類別用來限制父類別不可以被子類別繼承,這種好處主要是限制類別繼承的深度,
Ex:
//宣告密封類別
sealed class SealedClass
{
public const double PI = 3.1415F;
public void work()
{
Console.WriteLine("密封類別不可以work繼承");
}
}
Ex: 繼承SealedClass,在編譯時會出現錯誤。
class SubSealedClass :SealedClass
{
}
- 抽象類別(Abstract class)
當我們建造房子之前須要先去做藍圖的規劃,抽象類別通常是指一個想法或是架構,
但未有實體的建造規格。當我們需要規劃一些共同抽象行為或是屬性,通常我們會先去
規畫一個樣板(template)然後再由其他的子類別去override這些行為
Ex:
//制定房子的架構
abstract class HourseTemplate
{
private string _hourseType;
public string HourseType
{
get { return _hourseType; }
set { _hourseType = value; }
}
abstract protected void Length(double l); //長度
abstract protected void Width(double w); //寬度
abstract protected void Heigh(double h); //高度
abstract public double Volume(); //體積
abstract protected void Condition(string condition);
}
class Department:HourseTemplate
{
private double w;
private double l;
private double h;
private string condition;
public Department(double length, double width, double heigh)
{
Length(length);
Width(width);
Heigh(heigh);
}
protected override void Length(double l)
{
this.l = l;
}
protected override void Width(double w)
{
this.w = w;
}
protected override void Heigh(double h)
{
this.h = h;
}
public override double Volume()
{
return this.l * this.w * this.h;
}
protected override void Condition(string condition)
{
throw new NotImplementedException();
}
}
class Codominiun:HourseTemplate
{
private double w;
private double l;
private double h;
private string condition;
protected override void Length(double l)
{
this.l = l;
}
protected override void Width(double w)
{
this.w = w;
}
protected override void Heigh(double h)
{
this.h = h;
}
protected override void Condition(string condition)
{
this.condition = condition;
}
//自訂方法
public double Area()
{
return this.l * this.w ;
}
public override double Volume()
{
return this.l * this.w * this.h;
}
}
TestHourse.cs主程式
public static void Main()
{
Department department = new Department(50,50,1000);
department.HourseType = "大樓" ;
Console.WriteLine("{0}:{1}", department.HourseType, department.Volume());
}
{
Department department = new Department(50,50,1000);
department.HourseType = "大樓" ;
Console.WriteLine("{0}:{1}", department.HourseType, department.Volume());
}
留言
張貼留言