posts - 11, comments - 29, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

C#与Java(一)

Posted on 2005-11-11 10:27 -=Kinohl=- 阅读(1465) 评论(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=-
切尔斯基
谢谢提示,已经修正。

只有注册用户登录后才能发表评论。


网站导航: