參考文獻 :
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//此處描述 :
在介紹繼承之前先簡單介紹一下類型(class)
class 中包含三個部分
1.//properties
2.//constructor
3.//methods
在OO(object-oriented )語言中就像C# /C /C++/JAVA所有概念都是由物件所組成,而class就像是藍圖一樣,像室內設計師在設計圖面時,可能會有水電圖、天花圖、平面設計圖、迴路圖等圖面,而藍圖就是管理這些所有圖面的資料夾。
依照設計師的使用需求不同,設計師可以套繪不同的平面在同一個底圖上。我們可以把所有的圖面(水電圖、天花圖)想像成class中的methods,當設計師今天只需要平面設計圖與天花圖的時候,只要從藍圖中抽取出需要的圖面即可,這樣的藍圖(class)也間接的幫設計師做好管理打包(encapsulation)的工作。
單然很多資料夾之間也可能存在著檔案共享或是繼承的關係,所以往後再繼續介紹類型的其他好用之處。
msda介紹class
A class is a construct that enables you to create your own custom types by grouping together variables of other types, methods and events. A class is like a blueprint. It defines the data and behavior of a type.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//此處示範基本class 創建方式
//創建圓法一:
//properties
//型態內建的變數我們就稱之為properties
Point3d point;
double rad;
//constructor
//你可以有多個constructor在這裏我們有兩個,如果有多個以上constructor我們稱之為overload
//要注意的是constructor 的名稱必須與類型名稱一致,而且當類型一旦被創建的//同時,即是
//呼叫constructor,constructor並不會回傳任何型態。
//此處this 關鍵字是把constructor 中的parameter 當成類型中的argument來使用的意思
public WeiA(){
}
public WeiA(Point3d point, double rad){
this.point = point;
this.rad = rad;
}
//methods
//即是類型中你要使用的方法
public Circle drawWeiA(){
Circle circleA = new Circle(point, rad);
return circleA;
}
}
//以此為例 double mynumber
//就像我們常用的double 雙浮點小數
//我們創建名為mynumber的物件,型態為double
//在此我們創建名為myA 的物件,型態為WeiA
//而這部分new WeiA();即是呼叫class 中的constructor
WeiA myA = new WeiA(new Point3d(0, 0, 0), 10.0);
A = myA.drawWeiA();
當我們創建好myA 的物件時可以看到使用者自訂的類型出現在選單中。而這個選單就是使用者所創建的method |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
輸出圖像:
你已經簡單的使用類型創建出一個圓 |
//創建圓法二:
當然你也可以用rhinocommond SDK的方法來直接創建一個圓(因為C#本身就是OO概念,我在這邊只是在示範
如何創建自己的類型,使用畫圓的方式而已)
程式碼:
Circle mycircle = new Circle(new Point3d(0, 0, 0), 10.0);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//此處補充修飾詞
類別或成員可以使用下面幾個修飾詞來定義存取方式:
public:存取沒有限制。
private:只有類別本身能存取。
protected:只有類別本身和其衍伸類別本身能存取。
internal:只有同一個 Namespace 的地方能看到。
public:存取沒有限制。
private:只有類別本身能存取。
protected:只有類別本身和其衍伸類別本身能存取。
internal:只有同一個 Namespace 的地方能看到。
EX:public sealed class A{}
相對,如果希望類別一定要被繼承後才可以使用,本身無法直接使用時,可以使用 abstract 修飾詞。
EX:public abstract class B{}
範例:
WeiA(){
}
}
or
protected class WeiA{
WeiA(){
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//此處示範基本inheritance 創建方式
//WeiA 是superclass也是父層
public class WeiA{
Point3d point;
double rad;
public WeiA(){
}
public WeiA(Point3d point, double rad){
this.point = point;
this.rad = rad;
}
public Circle drawWeiA(Point3d point, double rad){
Circle circleA = new Circle(point, rad);
return circleA;
}
}
//WeiB繼承WeiA的類型內部資料
//WeiB稱之為subclass也是子層
public class WeiB : WeiA{
public WeiB(){
}
}
//create object myA//
WeiA myA = new WeiA();
//create object myB//
WeiB myB = new WeiB();
A = myA.drawWeiA(new Point3d(0, 0, 0), 10.0);
B = myB.drawWeiA(new Point3d(0, 0, 0), 5.0);
//在此我們要注意的是在myB的物件中並沒有創建drawWeiA的method,使用者卻在創建myB的物件後可以調動
//drawWeiA的方法,原因是 WeiB : WeiA(WeiB類型繼承了WeiA的內部資料)
WeiB類型繼承了WeiA的內部資料 |
使用inheritance 創建出基本圖形 |
//此處示範基本virtual and override創建方式
//當我們從父層繼承而來的方法時卻發現內部資料需要被改變"但method名子"卻又相同時,那該如何解決?
//答案就是使用關鍵字virtual and override
//在父層相同名子的method 中前面加入關鍵字virtual 當作抽象的方法
//在子層相同名子的method 中前面加入關鍵字override 當作覆寫的方法
public class WeiA{
Point3d point;
double rad;
public WeiA(){
}
public WeiA(Point3d point, double rad){
this.point = point;
this.rad = rad;
}
public virtual Circle drawWei(Point3d point, double rad){
Circle circleA = new Circle(point, rad);
return circleA;
}
}
public class WeiB : WeiA{
public WeiB(){
}
public override Circle drawWei(Point3d point, double rad){
Circle circleA = new Circle(point, rad / 2);
return circleA;
}
}
//create object myA//
WeiA myA = new WeiA();
//create object myB//
WeiB myB = new WeiB();
A = myA.drawWei(new Point3d(0, 0, 0), 10.0);
B = myB.drawWei(new Point3d(0, 0, 0), 10.0);
//我們可以在此發現都是調用一樣的方法drawWei 輸入一樣的參數 new Point3d(0, 0, 0), 10.0
//那為什麼出來的圖形卻是不一樣,答案就是使用覆寫method內部資料的關鍵字。
// A = myA.drawWei(new Point3d(0, 0, 0), 10.0);
// B = myB.drawWei(new Point3d(0, 0, 0), 10.0);
使用一樣的method 與參數,卻產生出不一樣的半徑圓 |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//此處延續virtual and override補充 new
//資料再補充 override and new 的差別
沒有留言:
張貼留言