关键字:
使用abstract关键字可以创建不完整且必须在派生类中实现的类和类的成员。
抽象类
- 抽象类是特殊的类,只是不能被实例化;除此以外具有类的其他特性;
- 重要的是抽象类可以包括抽象方法,这是普通类所不能的;
- 抽象类中也可以编写非抽象方法;
- 抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖。
- 抽象父类申请成对象,不能构造成父类使用,只能构造子类来使用。
- 抽象类中可以包含构造方法,但是构造方法不能被声明为抽象;
- 抽象类不能被密封或者静态。
抽象方法
1、抽象方法只能声明于抽象类中且不能包含任何实现,抽象方法只能由子类继承并实现才能使用,且子类必须实现它;
2、子类中覆写的抽象方法必须和父类的抽象方法要一一对应(返回类型、参数要一样);
3、在抽象类中抽象方法不提供方法体。 (1.2.3示例代码如下)
abstract class C1 //抽象类 父类
{
public abstract void PP(); //抽象方法
}
-------------------------------------------------------------------------------------------
abstract class C2: C1 //子类
{
public override abstract void PP(); //继承抽象方法
}
-------------------------------------------------------------------------------------------
class C3: C2 //子类的子类
{
public override void PP() //继承方法
{
Console.WriteLine(15);
}
}
-------------------------------------------------------------------------------------------
class Program
{
static void Main(string[] args)
{
C3 c3 = new C3(); 声明创建c3
c3.PP(); 用c3将pp调用出来
Console.ReadKey();
}
}
4、声明抽象方法时,不能使用virtual、static、private、sealed修饰符;
接口interface 关键字: interface
1.interface解决了类不能多重继承的问题;
2.接口起到约束作用,便于更好地管理代码,避免遗漏;
3.接口是一种规范/协议;
注意+代码:
子类可以有且只有一个父类,但可以继承多个接口(“,”隔开)。(interface1,interface2是接口)
class Lei2: Lei1, Interface1, Interface2
{
类主体
}
接口可以包含属性、方法、事件、索引器,不能包含常量、字段、构造函数、析构函数、静态成员,不能进行运算符重载。
接口中所有成员默认公开,不能有修饰符。
接口里方法不能用访问修饰符,无方法体,以“;”结束。
interface Interface1
{
void FFF(); //没有修饰符 没有方法体 以;结束
}
接口不能直接实例化使用。
类、结构、接口,都可以多重继承接口。
抽象父类继承接口,可能实现接口方法,也可以转换成抽象,如果类同时继承类和接口,要把类写在前面,接口写在后面,类名和接口名之间用“,”隔开。接口没有先后顺序。
可以修改成一下代码所示:
abstract public void FFF(); 转化抽象 公开
//或者
public void FFF() 加公开、方法体
{
}
类一旦继承接口,必须实现接口的所有成员,接口1继承接口2,接口1不用实现接口2的方法。
接口与抽象类的共同点和区别
共同点:
1.都可以被继承
2.都不能被直接实例化
3.都可以包含方法声明,都没有方法体
4.派生类必须实现为实现的方法(没有方法体的方法)
区别:
1.抽象类可以定义字段、属性、方法实现等;接口只能定义属性、索引器、事件和方法声明,不能包含字段等。
2.抽象类是一个不完整的类,需要进一步细化;而接口是一个行为规范。
3.接口能继承多个,抽象类只能继承一个。
4.抽象类只需要派生类实现抽象方法,但是接口要求必须实现它的所有成员。
interface Interface1 //接口1
{
string S //属性
{
get;
set;
}
int Function(int a, int b); //方法
}
interface Interface2 //接口2
{
void Function(); //接口里的方法
}
interface Interface3 //接口3
{
void Function3(); //接口3的方法
}
abstract class Class1: Interface3 //抽象类class1继承接口3
{
public abstract void Function3(); //将抽象3中的方法转化为抽象方法
}
class Game: Class1,Interface1, Interface2 //类Game继承父类Class1,接口1,2
{
public string S //实现接口1中的属性s
{
get;
set;
}
public int Function1(int a, int b) //实现接口1中的方法
{
int c = a + b;
return c;
}
public void Function2() //实现接口2中的方法
{
Console.WriteLine("Function2");
}
public override void Function3() //实现接口3中的方法 因为Class1继承了接口3
{
Console.WriteLine("Function3"); //Game继承了Class1
}
}
class Program
{
static void Main(string[] args) //主方法输出
{
Game game = new Game();
game.S = "OK";
Console.WriteLine(game.S);
Console.WriteLine(game.Function1(5, 6));
game.Function2();
game.Function3();
Console.ReadKey();
}
}
--->
OK
11
Function2
Function3
参考老师:https://blog.csdn.net/NCZ9_/article/details/83899764