用乙個簡單示例來說明C 中的繼承 封裝和多型

2021-06-03 01:32:31 字數 3343 閱讀 1449

下面先來敘述一下問題的描述:要求設計乙個能描述所有圖形公共屬性和方法的的類(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,...