关于函数(C#)
关于函数的几个重要概念:类、对象、继承、封装、虚函数、重载函数、重写函数、虚拟函数、静态函数、抽象函数、密封函数(不可派生)、函数的隐藏、接口、抽象类
类的构造函数的重载:同一个类中的函数,如果函数名相同,而参数类型或个数不同,认为是不同的函数,这叫函数重载。仅返回值不同,不能看作不同的函数。这样,可以在类定义中,定义多个构造函数,名字相同,参数类型或个数不同。
Eg:
using System;
namespace e1//定义以下代码所属命名空间,意义见以后章节
{ class Person
{ private String name="张三";//类的数据成员声明
private int age=12;
public void Display()//类的方法(函数)声明,显示姓名和年龄
{ Console.WriteLine("姓名:{0},年龄:{1}",name,age);
}
public void SetName(string PersonName)//指定修改姓名的方法(函数)
{ name=PersonName;
}
public void SetAge(int PersonAge)//指定修改年龄的方法(函数)
{ age=PersonAge;
}
public Person(string Name,int Age)//构造函数,函数名和类同名,无返回值
{ name=Name;
age=Age;
}
public Person()//类的构造函数重载
{ name="构造函数可以被重载田七";
age=12;
}
}
class Class1
{ static void Main(string[] args)
{ Person OnePerson=new Person("李四",30);//生成类的对象
OnePerson.Display();
//下句错误,在其它类(Class1类)中,不能直接修改Person类中的私有成员。
//OnePerson.name="王五";
//只能通过Person类中公有方法SetName修改Person类中的私有成员name。
OnePerson.SetName("王五");
OnePerson.SetAge(40);
OnePerson.Display();
OnePerson=new Person();
OnePerson.Display();
}
10
}
}
键入CTRL+F5运行后,显示的效果是:
姓名: 李四,年龄:30
姓名: 王五,年龄:40
姓名: 田七,年龄:12
继承:让您通过扩展现有基类的功能来创建一个新的派生类,继承也允许建立类的层次结构。公用功能可以放在基类中,可以创建任意数量的派生类来利用此功能,而不用内部复制这些功能的代码。不支持多继承,即派生类只能从一个基类中来继承,不能从多个基类来继承。
Eg:
using System;
namespace fanwenjilei
{
public class Person
{
protected string ssn = "111-222-333-444" ;
protected string name = "Howells" ;
public virtual void GetInfo()
{
Console.WriteLine("姓名: {0}", name) ;
Console.WriteLine("编号: {0}", ssn) ;
}
}
class Employee: Person
{
public string id = "1999" ;
public override void GetInfo()
{
// 调用基类的GetInfo方法:
base.GetInfo();
Console.WriteLine("成员ID: {0}", id) ;
}
}
class TestClass
{
public static void Main()
{
Employee E = new Employee() ;
E.GetInfo() ;
}
}
}
程序运行结果:
姓名: Howells
编号: 111-222-333-444
成员ID: 1999
在C#中可以通过base关键字来访问基类成员,具体的访问规则如下:
(1) 调用基类上已被其他方法重写的方法。
(2) 指定创建派生类实例时应调用的基类构造函数。
(3) 基类访问只能在构造函数、实例方法或实例属性访问器中进行。
(4) 从静态方法中使用 base 关键字是错误的。
Virtual函数:的作用就是让子类可以重新定义父类方法的实现(overload)
Eg:
class 飞禽
{
{
public string wing; // 翅膀
public string feather; // 羽毛
…… // 其它属性和行为
public virtual bool Fly() // 利用关键字virtual来定义为虚拟函数,这是一个热点
{
// 空下来让子类去实现
}
}
class 麻雀 : 飞禽 // 麻雀从飞禽继承而来
{
…… // 定义麻雀自己特有的属性和行为
public override bool Fly() // 利用关键字override重载飞翔动作,实现自己的飞翔
{
…… // 实现麻雀飞的动作
}
public string feather; // 羽毛
…… // 其它属性和行为
public virtual bool Fly() // 利用关键字virtual来定义为虚拟函数,这是一个热点
{
// 空下来让子类去实现
}
}
class 麻雀 : 飞禽 // 麻雀从飞禽继承而来
{
…… // 定义麻雀自己特有的属性和行为
public override bool Fly() // 利用关键字override重载飞翔动作,实现自己的飞翔
{
…… // 实现麻雀飞的动作
}
}
class 鹤 : 飞禽 // 鹤从飞禽继承而来
{
…… // 定义鹤自己的特有的属性和行为
public override bool Fly() // 利用关键字override重载实现鹤的飞翔
{
…… // 实现鹤飞的动作
}
}
class 鹤 : 飞禽 // 鹤从飞禽继承而来
{
…… // 定义鹤自己的特有的属性和行为
public override bool Fly() // 利用关键字override重载实现鹤的飞翔
{
…… // 实现鹤飞的动作
}
}
这样我们只需要在抽象模型“飞禽”里定义Fly()这个行为,表示所有由此“飞禽”派生出去的子类都会有Fly()这个行为,而至于Fly()到底具体是怎么实现的,那么就由具体的子类去实现就好了,不会再影响“飞禽”这个抽象模型了。
静态函数:静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。静态构造函数既没
有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。 无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
Eg:1
public class Bus
{
// Static constructor:
static Bus()
{
System.Console.WriteLine("The static constructor invoked.");
}
public static void Drive()
{
System.Console.WriteLine("The Drive method invoked.");
}
}
class TestBus
{
static void Main()
{
Bus.Drive();
}
}
输出 _____________________________________
The static constructor invoked.
The Drive method invoked.
Eg:2
using System;
public class UseMethod
{ private static int x=0;//静态字段
private int y=1;//实例字段
public static void StaticMethod()//静态方法
{ x=10;//正确,静态方法访问静态数据成员
//y=20;//错误,静态方法不能访问实例数据成员
}
public void NoStaticMethod()//实例方法
{ x=10;//正确,实例方法访问静态数据成员
y=20;//正确,实例方法访问实例数据成员
}
}
public class Class1
{ public static void Main()
{ UseMethod m=new UseMethod();
UseMethod.StaticMethod();//使用静态方法格式为:类名.静态方法名
m.NoStaticMethod();//使用实例方法格式为:对象名.实例方法名
}
}
函数隐藏:是指加上new关键字的属性或函数将对本类和继承类隐藏基类的同名属性或函数。
public class A
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public new void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
对于上面这个例子来说,假如运行A a=new B();a.Method();会输出This Method in Class A!,这是因为class B继承于class A,现在B中的Method函数隐藏A中的Method,所以从B(包括继
承于B的子类)的角度来看类中的Method就是B.Method,A的Method不可见,但是如果从A的角度来看B,A只认识类B中继承于类A的Method函数,对于B类中的Method它不可见,所以A a=new B();a.Method();相当于是调用了类B中继承于A的Method函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论