posts - 11, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          C#與Java(一)

          Posted on 2005-11-11 10:27 -=Kinohl=- 閱讀(1493) 評論(2)  編輯  收藏 所屬分類: 編程語言

          C#與Java(一)


          ************************************************
          關鍵字:繼承
          難易度:易
          ************************************************


          最近因為工作需要開展基于C#的研發。我在這里也就寫一點作為Java程序員對于C#的部分感想吧。畢竟能力有限,請各位高手多多點撥。

          1.1實現的繼承

          C#和Java一樣不能繼承private。但是C++可以在繼承中明確指出要繼承共有的還是私有的。如下:

          這個是C#的繼承書寫方法,作為基類的CSharpBaseClass并沒有限定符。

          1class CSharpClass :CSharpBaseClass
          2{
          3   //成員
          4}

          這個是Java了,熟悉吧。

          public Class JavaClass extends JavaBaseClass
          {
            
          //成員
          }

          C++的定義如下:

          class CPlusPlusClass: public CPlusPlusBaseClass
          {
             
          //成員
          }

          1.2虛函數

          把一個基類函數聲明為virtual,該函數就可以在任何派生類中重寫了。
          Java的語法中沒有virtual這個詞,但是Java卻徹徹底底的貫徹著這個概念,Java的所有函數都是虛擬的。
          C++的朋友可能比較熟悉這個詞吧。對于這一點C#和C++是相同的。但是語法稍微有點不同,C#需要使用override類顯示聲明重寫函數。如下例

          class BaseClass
          {
                   
          public virtual string VirtualMethod()
                  
          {
                             
          return "The virtual method in defined in Base class";
                  }

          }


          class ChildClass : BaseClass
          {
                      
          public override string VirtualMethod()
                  
          {
                             
          return "The override method in defined in child class";
                  }

          }



          1.3隱藏方法
          相同簽名的方法在基類和子類都聲明了,但方法不是vitrual。那么實際中到底哪個方法被執行,取決于引用實例的變量類型,而不是實力本身的類型。
          我們也不用太擔心這個問題,因為C#會在編譯期給出警告。

          1.4調用積累函數的方法
          java中我們使用super,C#中使用base。

          1.5抽象類和抽象函數
          和java一樣使用abstract聲明。
          和C++相比,C++的抽象函數被聲明為純虛函數。

          1.6密封類和密封方法
          在Java中我們把它叫做final。也就是不能繼承的類或不能重載的方法。

          1.7構造函數的調用層次
          和Java一樣,我就不多說了。這里強調一個特殊的語法格式:

          public class BaseClass
          {
            
          private temp = "Default Construct";

            
          public string _flag
            
          {
               
          getreturn temp;}
               
          set{ temp = value;}
            }



            
          //Constructor with one Parameter
            public BaseClass(string f)
            
          {
                flag 
          = f;
            }

          }


          public class ChildClass : BaseClass
          {
             
          public ChildClass():base("Customized Construct"){}

             
          public Second(string f):base("BPara:CPara = 1:1"){}

             
          public Second(string f,string g):base("BPara:CPara = 1:2"){}

             
          private static void showConstructFlag()
             
          {
                
          new Second();
                Console.WriteLine(
          "Show ConstructFlag:\n ChildClass():base(\"Customized Construct\")="+_Flag);

                
          new Second("test1");
                Console.WriteLine(
          "Show ConstructFlag:\n Second(string f,string g):base(\"BPara:CPara = 1:1\")="+_Flag);

                
          new Second("test2","no use");
                Console.WriteLine(
          "Show ConstructFlag:\n Second(string f,string g):base(\"BPara:CPara = 1:2\")="+_Flag);
              }

             
              
          public static void Main()
              
          {
                  showConstructFlag();
              }

          }

          結果如預計那樣 :
          如果基類含有帶參數的構造函數,派生類不能調用默認基類構造函數。
          多參數派生類構造函數,可以調用參數數目不同的基類構造函數。

          我們一起來看看為什么這2個結論可以成立:
          首先,對于帶參數的基類構造函數在初始化的時候會試圖去調用基類默認構造函數,但在上邊的基類程序里,因為只聲明了帶一個參數的構造函數,所以public Second(string f):base()或者public Second(string f)就不會通過編譯,因為他找不到基類的默認構造函數,只能追加public BaseClass()才會通過。這一點和JAVA是不同的,java的默認構造函數默認是不出現在代碼里的。C#卻一定要寫出來。

          <<<== 有錯誤。C#的默認構造函數體制和Java是一樣的。具體如下:
          1。父類沒有自定義構造函數的情況下,使用默認構造函數。用戶可以不寫出來。
          2。一旦父類有了自定義的構造函數,那么如果要使用無參的默認構造函數就必須要顯示定義。





          其次,下邊派生類1個參數、2個參數甚至多個參數的構造函數為什么能訪問只有一個參數的基類構造函數呢?原因是,關鍵字this,上邊的程序改寫如下我想大家就明白了。

          public Second(string f):base("BPara:CPara = 1:1"){}

          public Second(string f,string g):this(string f,"<None"){}

          2.1修飾符
          C#支持下邊的集中修飾符:
          public ,   protected , internal  ,private , protected internal
          同Java。internal和protected internal是.net framework新增的一個內容。根據定義。
          internal在同一個程序集內和public類似,不同的程序集間,public聲明的類或方法仍然可用,但是internal的方法或類則被隱藏。
          protected internal合并了protected 和internal,但這是一種or關系,而不是and關系。protected internal成員在同一個程序集的任何代碼都可見,在派生類可見。

          2.3接口
          接口公約:
          不能實例化接口。
          接口不能有構造函數或字段。
          接口定義也不允許包含運算符重載。
          接口定義中還不允許聲明成員上的修飾符。接口成員都是public的,不需要static也不需要virtual。

          同Java
          接口可以彼此繼承,其方式和類繼承相同。如下:

          namespace my.test
          {
            
          public interface IBase
            
          {
                
          void setName();
                
          bool isMe(string name);
                
          string name
                
          {
                   
          get;
                }

             }

          }


          namespace my.test
          {
              
          public interface IChild:IBase
              
          {
                 
          bool isOK();
              }

          }

          告一段落吧。                                 (つづく)
          請多提意見,如果有什么不清楚的地方也請你寫下來,一起調查咯。  


          評論

          # re: C#與Java(一)  回復  更多評論   

          2005-11-12 23:40 by 切爾斯基
          "這一點和JAVA是不同的,java的默認構造函數默認是不出現在代碼里的。C#卻一定要寫出來。"

          這是真的嗎?

          # re: C#與Java(一)  回復  更多評論   

          2005-11-14 11:02 by -=Kino=-
          切爾斯基
          謝謝提示,已經修正。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大洼县| 土默特右旗| 高唐县| 吉安县| 南开区| 德化县| 兴安盟| 当阳市| 龙井市| 毕节市| 濮阳市| 玉门市| 阿荣旗| 根河市| 神池县| 广丰县| 讷河市| 苏尼特右旗| 巨野县| 余干县| 武乡县| 望都县| 察哈| 辽阳县| 本溪| 桑植县| 富阳市| 塘沽区| 武夷山市| 阳原县| 泸州市| 彰武县| 海晏县| 内乡县| 长海县| 亳州市| 田东县| 辉南县| 临朐县| 德州市| 汝城县|