C#中可使用类来达到数据封装的效果,这样可以使数据与方法封装成单一元素,以便于通过方法存取数据。除此之外,还可以控制数据的存取方式。
在面向对象编程中,大多数都是以类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单位。设计类时,不希望直接存取类中的数据,而是希望通过方法来存取数据。这样就可以达到封装数据的目的,方便以后的维护升级,也可以在操作数据时多一层判断。
此外,封装还可以解决数据存取的权限问题,可以使用封装将数据隐藏起来,形成一个封闭的空间,然后可以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用。一个类中包含敏感数据,有些人可以访问,有些人不能访问,如果不对这些数据的访问加以限制,后果将会非常严重。所以要对类的成员使用不同的访问修饰符,从而定义他们的访问级别。
封装语法:
Public 数据类型 变量名
{
get
{
return 变量名;
}
set
{
变量名=value;
}
}
继承是面向对象最重要的特性之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承类的所有成员。在面向对象编程中,被继承的类称为父类或基类。C#中提供了类的继承机制,但只支持单继承,而不支持多继承,即在C#一次只允许继承一个类,不能同时继承多个类。
继承语法:
Public class 类名:父类名
如何使用父类里面的成员变量,方法,构造函数?
关键字:base
成员变量:
base.成员变量名
方法:
base.方法名
多态性意味着有多重形式。
在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态性可以是静态的或动态的。
在静态多态性中,函数的响应是在编译时发生的。
在动态多态性中,函数的响应是在运行时发生的。
1.静态多态性
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。
分别为:
1.1方法重载:
可以在同一个范围内对相同的方法名有多个定义。
方法的定义必须彼此不同,可以是参数列表中的参数类型不 同,也可以是参数个数不同。
不能重载只有返回类型不同的方法声明。
2.动态多态性
当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。
2.1:虚方法是使用关键字 virtual 声明的。
2.2:虚方法可以在不同的继承类中有不同的实现。
2.3:对虚方法的调用是在运行时发生的。
2.4:动态多态性是通过抽象类和虚方法实现的。
定义虚方法:
访问修饰符 virtual 返回的数据类型/void 方法名()
{
//执行代码,也可以完全不写
}
重写父类的方法(子类中):
访问修饰符 override 返回的数据类型/void 方法名()
{
//执行代码
}
1.Dog类
using System;//参考资料在QQ群:683782676
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _08
{
public class Dog
{
private string _name;
private int _age;
private string _sex;
//propfull 再双击tab生成如下代码:
/*
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}*/
public int Age
{
get { return _age; }
set
{
if (value>0&&value<17)
{
_age = value;
}
else
{
_age = 0;
}
}
}
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public int Age1
{
get
{
return _age;
}
set
{
_age = value;
}
}
public string Sex
{
get
{
return _sex;
}
set
{
_sex = value;
}
}
public int GetAge() {
return _age;
}
public void SetAge(int age) {
if (age > 0 && age < 17)
{
_age = age;
}
else {
_age = 0;
}
}
}
}
2.父类:Student(MinStudent和MaxStudent的父类)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _08
{
public class Student
{
private string _name;
private int _age;
private char _sex;
public Student() { }
public Student(string _name, int _age, char _sex)
{
this._name = _name;
this._age = _age;
this._sex = _sex;
}
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
public char Sex
{
get
{
return _sex;
}
set
{
_sex = value;
}
}
public string GetMe(){
return string.Format("姓名:{0},性别:{1},年龄:{2}", this.Name, this.Sex, this.Age);
}
//只定义而不实现的方法 我们叫做虚方法 虚方法也可以有方法体({中间的实现代码})
public virtual void ShowMe() {
}
}
}
3.子类:MinStudent(父类是Student)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _08
{
//小学生
public class MinStudent:Student
{
private string _class;
public MinStudent() { }
//base 基础
public MinStudent(string _class, string _name, int _age, char _sex):base(_name,_age,_sex)
{
this._class = _class;
}
public string Class
{
get
{
return _class;
}
set
{
_class = value;
}
}
//public void ShowMe() {
// string str=base.GetMe();
// Console.WriteLine("{0},年级:{1}",str,this.Class);
// Console.ReadKey();
//}
public override void ShowMe()
{
string str = base.GetMe();
Console.WriteLine("{0},年级:{1}",str,this.Class);
Console.ReadKey();
}
}
}
4.子类:MaxStudent(父类是Student)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _08
{
//大学生
public class MaxStudent:Student
{
private string _department;
public MaxStudent() { }
public MaxStudent(string _department, string _name, int _age, char _sex) :base(_name, _age, _sex)
{
this._department = _department;
}
public string Department
{
get
{
return _department;
}
set
{
_department = value;
}
}
//public void ShowMe()
//{
// string str = base.GetMe();
// Console.WriteLine("{0},系:{1}", str, this.Department);
// Console.ReadKey();
//}
//参考资料在QQ群:683782676
public override void ShowMe()
{
string str = base.GetMe();
Console.WriteLine("{0},系:{1}", str, this.Department);
Console.ReadKey();
}
}
}