C#高级(五)继承,派生类,派生类的构造方法

 

一、基本概念

首先我们来了解两个基本概念:实现继承和接口继承

1)、实现继承,表示一个类派生于一个基类型,并拥有该基类型的所有成员字段和函数。

2)、接口继承,表示一个类型只继承了函数的签名,没有任何实现的代码。在需要指定该类型具有某些可用的特性时,最好使用这种继承。

注意,在C#中,不支持多重继承,但一个类却可以实现多个接口。同样,结构总是派生于System.ValueType , 他们还可以派生于任意多个接口。

二、实现继承。

       (1)、我们先来看个例子。


  1. using System;
  2. namespace gosoa.com.cn
  3. {
  4.     public class baseClass
  5.     {
  6.         public string getUrl()
  7.         {
  8.             return "www.gosoa.com.cn";
  9.          }
  10.     }

  11.     public class test : baseClass
  12.     {       
  13.         static void Main()
  14.         {
  15.             test classOne=new test();
  16.             Console.WriteLine(classOne.getUrl());
  17.         }
  18.     }
  19. }


 

在上面的例子中,public class test : baseClass 就是声明了类test继承自baseClass。这样,在类test中也就具有了父类的方法,getUrl() 。在上例中输出结果是 www.gosoa.com.cn

 

2)、虚方法

       把一个基类中的方法声明为 virtual ,则该函数可以在任何派生类中重写了。

       C#中,函数默认下不是虚拟的,需要显式的声明。但在java中,所有函数都是虚拟的。C#中,派生类的函数重写另一个函数时,要使用override 关键字显式的声明。如果声明了 override 函数,但在基类中如果没有可以重写的函数,编译器就会报错了。

       注意,成员字段和静态函数都不能声明为 virtual ,因为这个概念只对类中的实例函数成员有意义。

       我们来看个例子。

  1. using System;
  2. namespace gosoa.com.cn
  3. {
  4.     public class baseClass
  5.     {
  6.         public virtual  string getUrl()
  7.         {
  8.             return "cnblogs.com";
  9.          }
  10.     }

  11.     public class baseClass2:baseClass
  12.     {
  13.         public override  string getUrl()
  14.         {
  15.             return "gosoa.com.cn";
  16.          }
  17.     }

  18.     public class test : baseClass2
  19.     {       
  20.         public override  string getUrl()
  21.         {
  22.                 return "www.gosoa.com.cn";
  23.          }

  24.         static void Main()
  25.         {
  26.             test classOne=new test();
  27.             Console.WriteLine(classOne.getUrl());
  28.         }
  29.     }
  30. }


本例的输出结果是 www.gosoa.com.cn

 

(3)、隐藏方法。

在上例中,baseClass2类的getUrl()方法,如果没有override 关键字,则baseClass2类的getUrl()方法就会隐藏基类的getUrl()方法。在编译的时候,系统会给予警告。

 

4)、调用函数的基本版本

       还是看上一个例子,我们稍作修改,如下,

 

  1. public class test : baseClass2
  2.     {       
  3.         public override  string getUrl()
  4.         {
  5.                 string url="http://";
  6.                 url+=base.getUrl();
  7.                 return url;
  8.          }

  9.         static void Main()
  10.         {
  11.             test classOne=new test();
  12.             Console.WriteLine(classOne.getUrl());
  13.         }
  14.     }

我们来看url+=base.getUrl();这一句,base就是调用基类的意思,所以,本例的输出结果是

http://gosoa.com.cn

 

(5)、抽象类和抽象方法。

       C#允许把类声明为 abstract ,抽象类不能实例化,抽象方法不没有执行代码。

       我觉得抽象类和抽象方法没有什么用,一般我们用接口就可以了。搞不太明白C#中这个抽象类和抽象方法到底想用来干什么。

6)、密封类和密封方法。

       如果把类声明为 sealed 即标明该类不可以被继承,如果是方法,则方法不可以被重写。

7)、派生类的构造方法。

       在派生类中,构造方法是依次从基类中执行,最后到派生类本身的构造函数。

       我们来看下面的例子:


  1. using System;
  2. namespace gosoa.com.cn
  3. {
  4.     public class userBase
  5.     {
  6.         private string username;
  7.         public  userBase()
  8.         {
  9.             Console.WriteLine( "I'm good men");
  10.          }

  11.         public  userBase(string username)
  12.         {
  13.             this.username=username;
  14.          }
  15.     }

  16.     public class oneMen : userBase
  17.     {
  18.         public  oneMen()
  19.         {
  20.             Console.WriteLine( "Yes , I'm very good !");
  21.         }
  22.         public  oneMen(string username):base(username)
  23.         {
  24.             Console.WriteLine( username +" is a  good  men!");
  25.         }
  26.         public  oneMen(string username,string hisWebSite):base(username)
  27.         {
  28.             Console.WriteLine( username +"'s webSite is  "+hisWebSite);
  29.         }

  30.         public static void Main()
  31.         {
  32.             oneMen classOne=new oneMen();
  33.             //oneMen classTwo=new oneMen("pan");
  34.             //oneMen classThree=new oneMen("pan","www.gosoa.com.cn");
  35.         }
  36.     }
  37. }


我们先声明了一个 userBase 类,其有个私有成员变量,还有两个构造函数。oneMen类派生自userBase 类。并且oneMen类有其自己的三个构造函数。public  oneMen(string username):base(username)这个构造函数继承了基类中的构造函数,间接的给基类中的私有字段赋值了。public  oneMen(string username,string hisWebSite):base(username) 这个构造函数也继承了基类的构造函数,在Main()函数中我们依次通过三种方式实例化oneMen类的时候,依次输出的结果是

oneMen()

I'm good men

Yes , I'm very good !

 

oneMen("pan")

pan is a  good  men!

 

oneMen("pan","www.gosoa.com.cn")

pan’s 's webSite is www.gosoa.com.cn

 

希望通过这个例子让大家了解到派生类的构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值