C#应用实训|任务2 银行卡账户类定义
发布者:唯众
布时间:2020-12-12 16:16:00
点击量:
任务描述
定义银行卡基类(Account类),并分别定义两个子类:借记卡账户子类(DebitAcc)和信用卡账户子类(CreditAccount)。
知识引入
- 构造方法
构造方法就是一种特殊的方法,它主要用于为对象分配存储空间,完成对象初始化工作,必须在实例化对象的时候调用。定义构造方法的语法如下:
Public 类名(参数列表) //构造方法名与类名同名,没有返回值类型
{
//构造方法体
}
【
例3-4】
结合上例3-1,给Person类加上无参构造方法和带参构造方法。
Class Person
{ //成员变量(属性/字段)
public string name; //姓名
public string sex; //性别
public int age; //年龄
// 无参构造方法
public Person()
{
}
// 带参构造方法
public Person(string name,string sex,int age)
{
//this表示当前类的对象 this.用于访问当前类的成员
this.name = name; //this.name访问的是成员。name访问的是参数
this.sex = sex;
this.age = age;
}
public void sleep() //成员方法
{
Console.WriteLine("是人都要睡觉!");
}
public void show() //成员方法
{
Console.WriteLine("姓名:" + name);
Console.WriteLine("性别:" + sex);
Console.WriteLine("年龄:" + age);
}
}
【
例3-5】
分别调用无参构造方法和带参构造方法实例化对象。
class Program
{
static void Main(string[] args)
{
Person p1 = new Person(); //调用无参构造方法实例化p1对象
Person p2 = new Person("张三丰","男",21); //调用带参构造方法实例化p2对象
p2.show();
}
}
总结定义构造方法一定要注意如下两点:
·构造方法名与类同名
·不能有返回值,且不能写void
带参构造方法和无参构造方法都是实例化对象时调用,不同的是,圆括号里面填写给对象赋值的数据。在上面这段代码里面,为对象赋初值只用了一行代码。
构造方法的作用如下:
·构造方法可以更简捷地为对象赋初值。实例化对象的同时,就可以给该对象的所有成员变量赋初值
·对象的每一个成员变量要存储数据,就要在内存中开辟空间。类的构造方法最大的作用,就是为对象开辟内存空间,以存储数据。这也是为什么实例化对象的时候,一定要调用构造方法的原因
·构造方法只有实例化对象的时候才能调用,不能像其他方法那样通过方法名调用
在前面学习到,定义一个变量就会在内存中开辟一个空间存储数据。实例化一个对象后,对象的成员变量也要开辟内存空间,这个重要的任务就是构造方法完成的。
- 属性
在C#中有两个常用的访问修饰符:private和public。程序中一般用public修饰符来定义成员变量和成员方法,这样就可以在别的类中来访问它,但这其实破坏了类的封装性,因任何类都可以访问public成员。
Public修饰符公开成员变量,所有类都可以访问它;private修饰符么有成员变量,只有本类内部代码才能访问它。这样就出现了使用public不安全,private访问不方便。为此C#提供了属性,通过属性可以读取和写入私有变量,以此对类中的私有成员变量进行保护,并且在保护的同时,允许别的类象直接访问成员变量一样访问属性。定义属性的语法如下:
访问修饰符 数据类型 属性名
{
get
{
返回私有成员变量;
}
set
{
设置私有成员变量;
}
}
【
例3-6】
定义属性和使用属性访问成员变量。
·定义属性
class Person
{
private string name;
private int age;
public Person() { }
public Person(string name,int age)
{
this.Name = name;
this.Age = age;
}
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;//value是隐式的变量
}
}
public int Age
{
get
{
return this.age;
}
set
{
this.age = value;//value是隐式的变量
}
}
public void Show()
{
Console.WriteLine("姓名:" + Name);
Console.WriteLine("年龄:" + Age);
}
}
·使用属性访问成员变量
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("张三",19);
p1.Show();
Person p2 = new Person();
p2.Name = "毛毛";//对Name属性赋值,即是对私有成员name赋值
p2.Age = 17;
p2.Show();
}
}
上例编译执行后结果如图3-10所示:
图3-10 定义和使用属性访问成员变量
3. 继承和多态
(1)继承
在面向对象技术中,继承是提高软件开发效率的重要因素之一,指特殊类的对象拥有其一般类的全部属性与方法,称作特殊类对一般类的继承。
继承是面向对象程序设计的主要特征之一,它可以让用户重用代码,也可以节省程序设计的时间。继承就是在类之间建立一种从属关系,使得新定义的子类(也叫派生类)的实例具有父类(也叫基类)的特征和能力。任何类都可以继承其他的类,这也就是说,这个类拥有它继承的类的所有成员。在OOP中,被继承的类称为父类或者基类,继承了其他类的类叫子类或者派生类。
继承的语法格式为:
Class 类名 : 父类类名
{
类体
}
【
例3-7】
继承示例,说明什么是子类,什么是父类。
class Person //定义Person类,父类
{
public string name;
public int age;
public void Say()
{
Console.WriteLine("你好,我是{0},我今年{1}岁",name,age);
}
}
class Man
{
public void Eat()
{
Console.WriteLine("我正在吃大闸蟹!");
}
}
class Student:Person //Student类继承了Person类,它也具备了Person类的所有成员变量和方法
{
//也可以在子类中添加新的成员变量和成员方法
public string sex;
public void Play()
{
Console.WriteLine("我是{0}生我怕谁,我在玩天天酷跑.....",sex);
}
}
/*
class Student : Person, Man //错误,只能单继承
{
}
*/
class Program
{
static void Main(string[] args)
{
Student st = new Student();
st.name = "刘备";
st.age = 18;
st.Say();
st.sex = "男";
st.Play();
}
}
在上面的示例中,我们看到,Studnet类(子类)继承了Person类(父类),则Student类也自动具备有name和age两个成员变量以及Say()方法。同时Student类可以增加自己的成员变量sex和成员方法play ( ),可以给这些成员变量赋值,还调用了Say()方法。这就是继承作用。在这里,Person类是父类,Student类是子类。
另外,C#仅支持单一继承,也就是一个子类只能继承一个类,不能同时继承多个类。如在上面的示例中,Student不能同时继承Person类和Man类。
程序编译执行后输出结果如图3-11所示
图3-11 继承示例
(2)多态
多态性是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同数据类型或表现出不同的行为。这使得同一个属性或行为在一般及期限各个特殊类中具有不同的语义。
当子类继承父类后,如何让子类和父类的方法执行起来不一样,每个子类都有自己的方式执行该“行动”?这就是多态的一个重要特性——重写。子类重写父类的方法,重写需要用到两个关键字:vartual和override。
通常,派生类继承基类的方法,在调用对象继承方法的时候,执行的是基类的实现。但是,有事需要对派生类中继承的方法有不同的实现。例如,假设动物类存在“叫”的方法,从中派生出猫类、老鼠类和人类,猫类、老鼠类和人类叫的行为是各不相同的,因此,同一方法在不同子类中需要两种不同的实现,这就需要子类“重新编写”基类中的方法。“重写”就是在子类中对父类的方法进行修改或者说在子类中它进行重新编写。
【
例3-8】
多态性示例,子类重写父类相应方法。
class Animal //动物类
{
public string name;
public virtual void say() //定义为虚方法,子类可以对父类方法重写
{
Console.WriteLine("Animal hou......");
}
public void run()
{
Console.WriteLine("Animal run......");
}
}
class Cat:Animal //猫类
{
public override void say() //对父类方法进行重写
{
Console.WriteLine(“Tom:” + "喵喵喵......");
}
}
class Mouse : Animal //老鼠类
{
public override void say()
{
Console.WriteLine(“Jerry:” + "吱吱吱......");
}
}
class People:Animal //人类
{
public override void say()
{
Console.WriteLine(“华仔:” + "忘情水......");
}
}
class Program
{
static void Main(string[] args)
{
////父类的句柄可以指向子类的对象,反之则不行
//Animal an1 = new Cat();
//an1.say();
Cat ct = new Cat();
Mouse mou = new Mouse();
People p = new People();
PolymorphicTest(ct);
PolymorphicTest(mou);
PolymorphicTest(p);
}
static void PolymorphicTest(Animal an)
{
an.say(); //多态性
}
}
程序编译执行后输出结果如图3-12所示
图3-12 多态示例
任务实现
【
例3-9】
实现银行卡账户类定义,程序代码如下:
class Account //账户类,父类 ,以下是共有属性和方法
{
public long aid; //账户编号
public string aname; //储户姓名
public string personId; //身份证号
public string password; //密码
public double balance; //账户余额
public Account() { }
public Account(long aid,string aname,string personId,string password,double balance)
{
this.aid = aid;
this.aname = aname;
this.personId = personId;
this.password = password;
this.balance = balance;
}
}
class DebitAcc : Account //借记卡子类
{
public DebitAcc(long aid, string aname, string personId, string password, double balance)
: base(aid, aname, personId, password, balance)
{
}
}
class CreditAccount : Account //信用卡子类
{
private double overdraft; //透支金额
public CreditAccount(long aid, string aname, string personId, string password, double balance, double overdraft)
: base(aid, aname, personId, password, balance)
{
this.overdraft = overdraft;
}
}
任务小结
- 构造方法用于实例化对象,并为对象分配空间。
C#中只能单继承,不支持多继承,子类中可以通过使用base关键字调用父类的成员方法或构造方法。
上一篇:C#应用实训|任务1 银行业务类定义
下一篇:C#应用实训|任务3 银行卡账户开户实现