2013年3月29日 星期五

<心得> Introduce class inheritance in Grasshopper C#

目標 : 介紹基本繼承關係概念以及簡單繼承範例。


參考文獻 :

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//此處描述 :

在介紹繼承之前先簡單介紹一下類型(class)

class 中包含三個部分
1.//properties
2.//constructor
3.//methods

在OO(object-oriented )語言中就像C# /C /C++/JAVA所有概念都是由物件所組成,而class就像是藍圖一樣,像室內設計師在設計圖面時,可能會有水電圖、天花圖、平面設計圖、迴路圖等圖面,而藍圖就是管理這些所有圖面的資料夾。

依照設計師的使用需求不同,設計師可以套繪不同的平面在同一個底圖上。我們可以把所有的圖面(水電圖、天花圖)想像成class中的methods,當設計師今天只需要平面設計圖與天花圖的時候,只要從藍圖中抽取出需要的圖面即可,這樣的藍圖(class)也間接的幫設計師做好管理打包(encapsulation)的工作。

單然很多資料夾之間也可能存在著檔案共享或是繼承的關係,所以往後再繼續介紹類型的其他好用之處。

msda介紹class
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 創建方式

//創建圓法一:

  public class WeiA{

//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 的地方能看到。

當不希望類別再被繼承下去,可以使用 selected 修飾詞,類別將不可再被繼承,否則會發生錯誤訊息。
EX:public sealed class A{}

相對,如果希望類別一定要被繼承後才可以使用,本身無法直接使用時,可以使用 abstract 修飾詞。
EX:public abstract class B{}



範例:

  private class WeiA{

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 的差別
























沒有留言:

張貼留言