一、继承
什么是继承:继承是允许重用现有类去创建新类的过程。分类的原则是一个类派生出来的子类具有这个类的所有非私有的属性。
1、继承C#中的类:C#不支持多重继承,C#类始终继承自一个基类(如果未在声明中指定一个基类,则继承自System.Object)。
派生类继承基类的语法如下:
using System;
public class Person
{
//这是基类
}
public class Student:Person
{
//这是派生类
}
注:派生类继承基类时用“:”符号连接,派生类继承基类的所有非私有成员变量和方法。
2、调用基类的构造函数:
如果对类没有定义显式构造函数,则编译器将提供默认的构造函数,以初始化这些类的成员字段。但是,如果显式添加了构造函数,就可以有效控制整个构造过程。
示例:
using System;
namespace Jicheng
{
//基类
public class Person
{
public string _name;
public uint _age;
//基类的构造函数
public Person(string name,uint age)
{
this._name = name;
this._age = age;
//打印输出
Console.WriteLine(_name);
Console.WriteLine(_age);
}
}
//派生类
public class Student:Person
{
private uint _id;
//派生类构造函数并调用基类构造函数用“:base”
public Student(string name,uint age uint id):base(name,age)
{
this._id = id;
1、继承C#中的类:C#不支持多重继承,C#类始终继承自一个基类(如果未在声明中指定一个基类,则继承自System.Object)。
派生类继承基类的语法如下:
using System;
public class Person
{
//这是基类
}
public class Student:Person
{
//这是派生类
}
注:派生类继承基类时用“:”符号连接,派生类继承基类的所有非私有成员变量和方法。
2、调用基类的构造函数:
如果对类没有定义显式构造函数,则编译器将提供默认的构造函数,以初始化这些类的成员字段。但是,如果显式添加了构造函数,就可以有效控制整个构造过程。
示例:
using System;
namespace Jicheng
{
//基类
public class Person
{
public string _name;
public uint _age;
//基类的构造函数
public Person(string name,uint age)
{
this._name = name;
this._age = age;
//打印输出
Console.WriteLine(_name);
Console.WriteLine(_age);
}
}
//派生类
public class Student:Person
{
private uint _id;
//派生类构造函数并调用基类构造函数用“:base”
public Student(string name,uint age uint id):base(name,age)
{
this._id = id;
//打印输出
Console.WriteLine(_id);
}
}
public class Exercise
{
[STAThread]
static void Main(string[] args)
{
//构造 Student
Student objstudent=new Student(“XYZ”,45,001);
}
}
}
注:派生类通过使用:base()语法可以显式调用基类的构造函数。在必要的情况下,可以利用它来初始化字段。
Console.WriteLine(_id);
}
}
public class Exercise
{
[STAThread]
static void Main(string[] args)
{
//构造 Student
Student objstudent=new Student(“XYZ”,45,001);
}
}
}
注:派生类通过使用:base()语法可以显式调用基类的构造函数。在必要的情况下,可以利用它来初始化字段。
二、C#中的方法重写
关键字:override
override关键字用语修改方法,具有override关键字修饰符的方法是对基类中同名方法的新实现,基类中的同名方法必须声明为virtual或abstract类型。给基类中的方法添加virtual关键字表示可以在派生类中重写它的实现。
1、默认的C#方法并非virtual,因此不能重写。
2、基类方法的可访问级别并不因重写它的方法而改变,他们的访问修饰符相同。
3、new、static和virtual关键字不能与override访问修饰符一同使用
关键字:virtual
C#中提供virtual关键字,用语将方法定义为支持多太,用于对一个类中可修改的方法的声明,这种方法称为虚拟方法,字类可以使用override关键字自由实现它们各自版本的虚拟方法
语法:
[访问修饰符] virtual [返回值类型] 方法名称([参数列表])
{
//虚拟方法的实现
}
1、virtual访问修饰符不能与static和override等访问修饰符一同使用
2、调用虚拟方法,在运行时系统会自动检查,以确定调调用了哪一个实现方法。
关键字:new
new访问修饰符用于显式隐藏继承自基类的成员,如果派生类成员与基类成员名称相同,new会将派生类成员识别为一个全新成员。
1、在一个方法中同时使用new和override将会出错。
2、new访问修饰符的真正目的是为了隐藏基类方法。
3、如果将一个方法生命为new,它实际上并没有隐藏基类方法,并且编译器也产生了警告,这时应该删除new。
关键字:override
override关键字用语修改方法,具有override关键字修饰符的方法是对基类中同名方法的新实现,基类中的同名方法必须声明为virtual或abstract类型。给基类中的方法添加virtual关键字表示可以在派生类中重写它的实现。
1、默认的C#方法并非virtual,因此不能重写。
2、基类方法的可访问级别并不因重写它的方法而改变,他们的访问修饰符相同。
3、new、static和virtual关键字不能与override访问修饰符一同使用
关键字:virtual
C#中提供virtual关键字,用语将方法定义为支持多太,用于对一个类中可修改的方法的声明,这种方法称为虚拟方法,字类可以使用override关键字自由实现它们各自版本的虚拟方法
语法:
[访问修饰符] virtual [返回值类型] 方法名称([参数列表])
{
//虚拟方法的实现
}
1、virtual访问修饰符不能与static和override等访问修饰符一同使用
2、调用虚拟方法,在运行时系统会自动检查,以确定调调用了哪一个实现方法。
关键字:new
new访问修饰符用于显式隐藏继承自基类的成员,如果派生类成员与基类成员名称相同,new会将派生类成员识别为一个全新成员。
1、在一个方法中同时使用new和override将会出错。
2、new访问修饰符的真正目的是为了隐藏基类方法。
3、如果将一个方法生命为new,它实际上并没有隐藏基类方法,并且编译器也产生了警告,这时应该删除new。
三、抽象类和抽象方法
什么是抽象类:不能被实例化的类称为抽象类,抽象类是派生类的基类。
关键字:abstract
语法:
abstract class 类名
{
…………
}
1、一个抽象类可以同时包含抽象方法和非抽象方法。
2、抽象方法只在派生类中真正实现,这表明抽象方法只存放函数原型,不涉及主体代码,
3、派生自抽象类的类需要实现其基类的抽象方法,才能实例化对象。
4、使用override关键子可在派生类中实现抽象方法,经override声明重写的方法称为重写基类方法,其签名必须与override方法的签名相同。
示例:
using System;
namespace Example_5
{
//抽象类
abstract class ABC
{
//抽象方法
public abstract void Afunc();
}
//派生类
class Derv:ABC
{
//实现抽象类中的抽象方法
public override void Afunc()
{
Console.WriteLine(“实现抽象方法”);
}
}
public class Test
{
static void Main(string[] args)
{
Derv obj=new Derv();
obj.Afunc();
}
}
}
5、基类实现抽象类,则派生类不需要重新实现该抽象类。
6、抽象类并不仅仅只是一种实现技巧,它更代表一种抽象的概念,从而为所有的派生类确立一种约定。
什么是抽象类:不能被实例化的类称为抽象类,抽象类是派生类的基类。
关键字:abstract
语法:
abstract class 类名
{
…………
}
1、一个抽象类可以同时包含抽象方法和非抽象方法。
2、抽象方法只在派生类中真正实现,这表明抽象方法只存放函数原型,不涉及主体代码,
3、派生自抽象类的类需要实现其基类的抽象方法,才能实例化对象。
4、使用override关键子可在派生类中实现抽象方法,经override声明重写的方法称为重写基类方法,其签名必须与override方法的签名相同。
示例:
using System;
namespace Example_5
{
//抽象类
abstract class ABC
{
//抽象方法
public abstract void Afunc();
}
//派生类
class Derv:ABC
{
//实现抽象类中的抽象方法
public override void Afunc()
{
Console.WriteLine(“实现抽象方法”);
}
}
public class Test
{
static void Main(string[] args)
{
Derv obj=new Derv();
obj.Afunc();
}
}
}
5、基类实现抽象类,则派生类不需要重新实现该抽象类。
6、抽象类并不仅仅只是一种实现技巧,它更代表一种抽象的概念,从而为所有的派生类确立一种约定。
四、接口
关键字:interface
语法:
修饰符 interface 接口名
{
//接口主体
}
1、一个接口就相当于一个抽象类,但是它不能半喊任何实现方法。
2、接口的每种方法都必须在派生类中实现。
3、接口有时候可以看成是类的模具,它指明一个类该提供哪些内容。
4、接口主体只限于方法、索引器、属性的声明。
5、接口中不能包含字段、构造函数和常量等。
6、接口成员是隐式公开的,如果对其显式指定访问级别,就会出现编译器错误。
7、在接口中不能实现任何方法,属性或者索引器。
8、在指定方法时,只需给出返回类型、名称和参数列表,然后以分号结束。
9、实现接口的语法与实现继承一样,都用冒号“:”
示例
interface Icustomer
{
………………
}
public class MyClass: Icustomer
{
………………
}
10、接口中的方法不能重写,只能实现。
11、
编码标准:
接口名称需始终冠以大写字母I
关键字:interface
语法:
修饰符 interface 接口名
{
//接口主体
}
1、一个接口就相当于一个抽象类,但是它不能半喊任何实现方法。
2、接口的每种方法都必须在派生类中实现。
3、接口有时候可以看成是类的模具,它指明一个类该提供哪些内容。
4、接口主体只限于方法、索引器、属性的声明。
5、接口中不能包含字段、构造函数和常量等。
6、接口成员是隐式公开的,如果对其显式指定访问级别,就会出现编译器错误。
7、在接口中不能实现任何方法,属性或者索引器。
8、在指定方法时,只需给出返回类型、名称和参数列表,然后以分号结束。
9、实现接口的语法与实现继承一样,都用冒号“:”
示例
interface Icustomer
{
………………
}
public class MyClass: Icustomer
{
………………
}
10、接口中的方法不能重写,只能实现。
11、
编码标准:
接口名称需始终冠以大写字母I
五、多重接口实现
C#中多重接口的实现,弥补了C#只能单一继承,不能多重继承弱点。
语法示例:
public intetface IName
{
void Name();
}
public interface IAge
{
void Age();
}
public class Consoleshow: IAge, IName
{
public void Name()
{
//具体实现
}
public void Age()
{
//具体实现
}
}
C#中多重接口的实现,弥补了C#只能单一继承,不能多重继承弱点。
语法示例:
public intetface IName
{
void Name();
}
public interface IAge
{
void Age();
}
public class Consoleshow: IAge, IName
{
public void Name()
{
//具体实现
}
public void Age()
{
//具体实现
}
}
六、显式接口实现
如果两个接口中有完全相同的签名,那么可以用“接口名.方法名”的方法显式的来实现接口。
示例:
public interface Iname
{
void Test();
}
public interface Iage
{
void Test();
}
public Test: Iname, Iage
{
void Iname Test()
{
// Iname借口的实现
}
void Iage Test()
{
// Iage借口的实现
}
}
如果两个接口中有完全相同的签名,那么可以用“接口名.方法名”的方法显式的来实现接口。
示例:
public interface Iname
{
void Test();
}
public interface Iage
{
void Test();
}
public Test: Iname, Iage
{
void Iname Test()
{
// Iname借口的实现
}
void Iage Test()
{
// Iage借口的实现
}
}
七、接口继承
通过合并其他接口,也可以新建接口。用于合并接口的语法于继承的语法非常相似,只是前者可以将多个接口合并成一个。一个类要实现一个接口,必须为基接口和派生借口的所有成员编写代码。