下面先來敘述一下問題的描述:要求設計乙個能描述所有圖形公共屬性和方法的的類(shape),然後設計若干個不同的繼承shape的子類,比如三角形、圓形,矩形等等,基本功能要求:能提供面積和周長的計算和輸出
接著我們就來用c#語言的封裝和繼承的特性分析一下這個類和子類的設計吧,首先就是父類的設計,想一想父類應該包含哪些屬性,或者方法呢,對於每個圖形我們知道他們都有自己的周長和面積,因此我們可以將其周長和面積放到父類shape中即可,對於所有具體的某種圖形都應該有計算和輸出其周長和面積的方法,那計算和輸出的方法應該放到子類中呢還是父類中去呢,我們可以從其變化的角度來分析,對於不同圖形來說,它們周長和面積的計算公式是不一樣的,因此我們可以這樣設計,在父類中只是宣告計算周長和面積的抽象方法,然後在其子類中去具體的實現即可,再來考慮輸出周長和面積的方法應該放到哪兒呢,是子類還是父類呢?在此我是這樣設計的,將輸出周長和面積的方法在父類中設計成共有虛擬的(即用public virtual修飾的),這樣做的好處是,子類的如果不去重寫父類的輸出方法,則預設呼叫父類的輸出周長和面積的函式,若是子類對輸出周長和面積的格式有一定的變化或者改進的話,子類就完全可以重寫(overide)周長和面積輸出方法,以滿足子類的需要,當重寫之後子類就會呼叫其重寫後的方法,即使是轉換成父類物件也是呼叫子類的重寫的方法(這就是多型性的體現),好了分析就到這裡吧;下面看看具體的**實現:
在父類shape**實現如下:
/// /// 所有圖形形狀的基類
///
public abstract class shape
set
}/// /// 面積
///
protected double area
set
}/// /// 形狀的名稱
///
protected string shapename
set
}/// /// 預設建構函式
///
protected shape()
/// /// 輸出周長
///
public virtual void printperimeter()
/// /// 輸出面積
///
public virtual void printarea()
/// /// 計算周長(因該方法為抽象方法,因此必須在子類中進行重寫)
///
///
public abstract double calculateperimeter();
/// /// 計算面積(因該方法為抽象方法,因此必須在子類中進行重寫)
///
///
public abstract double calculatearea();
}
注:shape類設計成抽象的,是因為它應該是所有形狀的基類;只能作為某種具體形狀的父類,不能被例項化
下面簡單設計了一下子類圓和三角形類的實現:
圓類**實現如下:
/// /// 圓形
///
public class circle : shape
set
}/// /// 預設建構函式
///
public circle(): base()
public circle(double r):this()
/// /// 設定半徑
///
///
public void setradius(double r)
/// /// 計算周長
///
///
public override double calculateperimeter()
/// /// 計算面積
///
///
public override double calculatearea()
/// /// 重寫父類虛擬的printarea方法輸出面積
///
public override void printarea()
/// /// 重寫父類虛擬的printperimeter方法 輸出周長
///
public override void printperimeter()
}
三角形類**實現如下:
/// /// 三角形
///
public class ********:shape
}public double b
}public double c
}#endregion
/// /// 繼承基類預設建構函式
///
public ********():base()
/// /// 建構函式(需傳入三角形的三個邊長)
///
/// 第乙個邊
/// 第二個邊
/// 第三個邊
public ********(double a, double b, double c):this()
}/// /// 設定三個邊的長度
///
/// 第乙個邊
/// 第二個邊
/// 第三個邊
public void setthreesidelength(double a, double b, double c)
}/// /// 檢查邊長
///
/// 第乙個邊
/// 第二個邊
/// 第三個邊
///
public bool checkside(double a, double b, double c)
else
}else
}/// /// 計算周長
///
public override double calculateperimeter()
/// /// 計算面積
///
public override double calculatearea()
}
測試呼叫**:
//shape ******** = new ********(3,4,5);
//shape circle = new circle(10);
shape shapes = new shape
;foreach (shape shape in shapes)
console.readkey();
本篇部落格只是我學習的理解和認識,希望對於剛學c#語言的朋友們理解繼承、封裝和多型有一定的幫助作用吧 ,有不對之處還望指正!
用乙個簡單示例演示在python中呼叫C及C
2016年11月20日 05 15,by 舒彩光 只要會c語言程式設計就很容易為python新增新的內建模組。可以通的c的擴充套件模組做兩種事,一是實現新的內建物件型別。另乙個是呼叫c的庫函式與系統呼叫。為了支援c擴充套件,python api定義了一系列函式,變數及巨集。只要在c或c 裡引入 py...
C 中enum的使用的乙個簡單示例
在c 中,switch 語句用得很多,但是,switch的引數比較單一,一般只支援int型,當switch 的引數是複雜的資料型別,如string或自定義的資料型別時,就需要enum對資料型別進行替代。如下面這個程式 include include class image image enum im...
乙個簡單的學習示例
bob bob smith 42,30000,software sue sue jones 45,40000,hardware print bob 0 sue 2 print n print bob 0 split 1 sue 2 1.25 print n print sue people bob,...