学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > C# >

第十章 C#继承 派生类 派生类的构造方法

设置字体:
----------------------------------
一、基本概念

首先我们来了解两个基本概念:实现继承和接口继承
(1)、实现继承,表示一个类派生于一个基类型,并拥有该基类型的所有成员字段和函数。
(2)、接口继承,表示一个类型只继承了函数的签名,没有任何实现的代码。在需要指定该类型具有某些可用的特性时,最好使用这种继承。
注意,在C#中,不支持多重继承,但一个类却可以实现多个接口。同样,结构总是派生于System.ValueType , 他们还可以派生于任意多个接口。

二、实现继承。

(1)、我们先来看个例子。
using System;namespace xuexuexi.com
{
public class baseClass
{ public string getUrl()
{
return "www.xuexuexi.com";
}
}
public class test : baseClass
{
static void Main()
{
test classOne=new test();
Console.WriteLine(classOne.getUrl());
}
}
}
在上面的例子中,public class test : baseClass 就是声明了类test 继承自baseClass。这样,在类test 中也就具有了父类的方法,getUrl() 。在上例中输出结果是 www.xuexuexi.com

(2)、虚方法

把一个基类中的方法声明为 virtual ,则该函数可以在任何派生类中重写了。在C#中,函数默认下不是虚拟的,需要显式的声明。但在java 中,所有函数都是虚拟的。C#中,派生类的函数重写另一个函数时,要使用override 关键字显式的声明。如果声明了override 函数,但在基类中如果没有可以重写的函数,编译器就会报错了。注意,成员字段和静态函数都不能声明为 virtual ,因为这个概念只对类中的实例函数成员
有意义。我们来看个例子。
using System;namespace xuexuexi.com
{
public class baseClass
{
public virtual string getUrl()
{
return "cnblogs.com";
}
}
public class baseClass2:baseClass
{
public override string getUrl()
{
return "xuexuexi.com";
}
}
public class test : baseClass2
{
public override string getUrl()
{
return "www.xuexuexi.com";
}
static void Main()
{
test classOne=new test();
Console.WriteLine(classOne.getUrl());
}
}
}
本例的输出结果是 www.xuexuexi.com

(3)、隐藏方法。

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

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

还是看上一个例子,我们稍作修改,如下,
public class test : baseClass2
{
public override string getUrl()
{
string url="http://";
url+=base.getUrl();
return url;
}
static void Main()
{
test classOne=new test();
Console.WriteLine(classOne.getUrl());
}
}
我们来看url+=base.getUrl();这一句,base 就是调用基类的意思,所以,本例的输出结果是http://xuexuexi.com

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

C#允许把类声明为 abstract ,抽象类不能实例化,抽象方法不没有执行代码。我觉得抽象类和抽象方法没有什么用,一般我们用接口就可以了。搞不太明白C#中这个抽象类和抽象方法到底想用来干什么。

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

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

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

在派生类中,构造方法是依次从基类中执行,最后到派生类本身的构造函数。
我们来看下面的例子:
using System;namespace xuexuexi.com
{
public class userBase
{
private string username;
public userBase()
{
Console.WriteLine( "I'm good men");
}
public userBase(string username)
{
this.username=username;
}
}
public class oneMen : userBase
{
public oneMen()
{
Console.WriteLine( "Yes , I'm very good !");
}
public oneMen(string username):base(username)
{
Console.WriteLine( username +" is a good men!");
}
public oneMen(string username,string hisWebSite):base(username)
{
Console.WriteLine( username +"'s webSite is "+hisWebSite);
}
public static void Main()
{
oneMen classOne=new oneMen();
//oneMen classTwo=new oneMen("pan");
//oneMen classThree=new oneMen("pan","www.xuexuexi.com");
----------------------------------
课程列表
重点难点
赞助链接