服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中Abstract 、Virtual和Override的使用及区别

C#中Abstract 、Virtual和Override的使用及区别

2022-11-22 11:46雪人学习 C#

C#中virtual,abstract,override用于方法重载,子类覆盖了父类的相同方法,父类中的实现不可能再被外面调用。本文给大家重点介绍C#中Abstract 、Virtual和Override的使用及区别,需要的朋友参考下吧

1. abstract 修饰符指示所修饰的内容缺少实现或未完全实现。abstract修饰符可用于类、方法、属性、索引器和事件。在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

(1)抽象类具有以下特性:

1) 抽象类不能实例化。

2) 抽象类可以包含抽象方法和抽象访问器。

3) 不能用sealed修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用sealed修饰符的类无法继承,而abstract修饰符要求对类进行继承。

4) 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

5) 在方法或属性声明中使用abstract修饰符以指示方法或属性不包含实现。

(2)抽象方法具有以下特性:

1) 抽象方法是隐式的虚方法。

2) 只允许在抽象类中使用抽象方法声明。

3) 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号({ })。

(3)在抽象方法声明中使用static或virtual修饰符是错误的。除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用abstract修饰符是错误的。在派生类中,通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
publicabstractclassparent
 
{
 
protectedintx=100;
 
protectedinty = 200;
 
publicabstractvoidfunction();
 
publicabstractintX {get; }
 
publicabstractintY {get; }
 
}
 
publicclassnewperson:parent
 
{
 
publicoverridevoidfunction()
 
{
 
x++;
 
y++;
 
}
 
publicoverrideintX
 
{
 
get{returnx+100; }
 
}
 
publicoverrideintY
 
{
 
get{returny+100; }
 
}
 
}
 
staticvoidMain(string[] args)
 
{
 
newpersonp =newnewperson();
 
Console.WriteLine(p.X);
 
Console.WriteLine(p.Y);
 
p.function();
 
Console.WriteLine(p.X);
 
Console.WriteLine(p.Y);
 
Console.ReadKey();
 
}

2.virtual关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。虚拟成员的实现可由派生类中的重写成员更改。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。不能重写非虚方法。virtual修饰符不能与static、abstract, private或override修饰符一起使用。和抽象方法的相同点是都用了override关键字进行重写方法,不同点是抽象方法必须存在于抽象类中,而子类必须重写,除非子类也是抽象的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
publicclassDimensions
 
{
 
publicconstdoublePI =Math.PI;
 
protecteddoublex;
 
protecteddoubley;
 
publicDimensions() { }
 
publicDimensions(doublex,doubley)
 
{
 
this.x = x;
 
this.y = y;
 
}
 
publicvirtualdoubleArea()
 
{
 
returnx * y;
 
}
 
}
 
publicclassCircle:Dimensions
 
{
 
publicCircle(doubler) :base(r,0) { }
 
 
publicoverridedoubleArea()
 
{
 
Console.WriteLine(base.Area());
 
returnPI * x * x;
 
}
 
}
 
publicclassSphere:Dimensions
 
{
 
publicSphere(doubler) :base(r,0) { }
 
publicoverridedoubleArea()
 
{
 
return4 * PI * x * x;
 
}
 
}
 
publicclassCylinder:Dimensions
 
{
 
publicCylinder(doubler,doubleh) :base(r, h) { }
 
publicoverridedoubleArea()
 
{
 
return2 * PI * x * x + 2 * PI * x * y;
 
}
 
}
 
staticvoidMain(string[] args)
 
{
 
DimensionsP =newCircle(5.0);
 
Spheresphere =newSphere(10);
 
Cylindercylinder =newCylinder(10, 10);
 
Console.WriteLine(P.Area());
 
Console.WriteLine(sphere.Area());
 
Console.WriteLine(cylinder.Area());
 
Console.ReadKey();
 
}

3.override方法提供从基类继承的成员的新实现。由override声明重写的方法称为重写基方法。重写的基方法必须与override方法具有相同的签名。不能重写非虚方法或静态方法。重写的基方法必须是virtual、abstract或override的。override声明不能更改virtual方法的可访问性。override方法和virtual方法必须具有相同的访问级别修饰符。重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract或override的。

4.base和this的区别

1)base作用:用于从派生类中访问基类的成员,调用基类上已被其他方法重写的方法。指定创建派生类实例时应调用的基类构造函数。

注:从静态方法中使用base关键字是错误的。
2)区别:

base是子类中引用父类,用于在派生类中访问重写的基类成员。
this是当前类,引用自己,用于访问本类的成员,当然也包括继承而来公有和保护成员。

3)注意:
a).在静态成员中使用base和this都是不允许的。原因是,base和this访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。
b).base是为了实现多态而设计的。
c).使用this或base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。
d).除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方法。

以上就是C#中Abstract 、Virtual和Override的使用及区别的详细内容,更多关于C# Abstract 、Virtual和Override使用的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/pandola/archive/2021/06/10/14869766.html

延伸 · 阅读

精彩推荐
  • C#适合初学者开发的C#在线英汉词典小程序

    适合初学者开发的C#在线英汉词典小程序

    这篇文章主要为大家详细介绍了适合初学者开发的C#在线英汉词典小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    毕毕love丹丹7142021-12-07
  • C#C#如何检测操作系统版本

    C#如何检测操作系统版本

    这篇文章主要为大家详细介绍了C#如何检测操作系统版本的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    IT菠萝蜜11642021-12-08
  • C#Unity Shader实现水墨效果

    Unity Shader实现水墨效果

    这篇文章主要为大家详细介绍了Unity Shader实现水墨效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    ZzEeRO3882022-09-06
  • C#C# 实现PPT 每一页转成图片过程解析

    C# 实现PPT 每一页转成图片过程解析

    这篇文章主要介绍了C# 实现PPT 每一页转成图片过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    仰望 星空9472022-08-07
  • C#c# 通过内存映射实现文件共享内存的示例代码

    c# 通过内存映射实现文件共享内存的示例代码

    这篇文章主要介绍了c# 通过内存映射实现文件共享内存的示例代码,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    zls3659542022-11-15
  • C#c# 组合模式

    c# 组合模式

    组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。需求中式体现部分与整体...

    C#教程网10492021-04-14
  • C#采用C#代码动态设置文件权限

    采用C#代码动态设置文件权限

    在开发中,我们经常会使用IO操作,例如创建,删除文件等操作。在项目中这样的需求也较多,我们也会经常对这些操作进行编码,但是对文件的权限进行...

    彭泽09027042021-12-13
  • C#Unity Shader实现2D游戏迷雾

    Unity Shader实现2D游戏迷雾

    这篇文章主要为大家详细介绍了Unity Shader实现2D游戏迷雾,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Emmmwzh9242022-09-06