Modifiers: virtual, override, new, abstract, sealed, internal
- internal
- 声明类、类成员、接口或接口成员具有内部可见性。
- internal 修饰符使类、接口或成员仅在当前包中可见。 当前包之外的代码不能访问 internal 成员。只有在同一程序集的文件中,内部类型或成员才是可访问的
- 在全局范围内,internal 修饰符与 public 修饰符相同。
- 不能将 internal 修饰符与其他任何可见性修饰符(public、private 或 protected)组合。 可见性修饰符相对于它们的定义范围。
- sealed
- 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。
- 在重写基类中的虚方法或虚属性的方法或属性上使用 sealed 修饰符。 这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性。
- 当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。
- abstract
- abstract 修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。 在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
- 抽象类不能实例化。
- 抽象类可以包含抽象方法和抽象访问器。
- 不能用 sealed(C# 参考) 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。 采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。
- 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
- 抽象方法是隐式的虚方法(virtual)。
- 只允许在抽象类中使用抽象方法声明。
- 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
- 实现接口的抽象类可以将接口方法映射到抽象方法上。
- new
- 在用作声明修饰符时,new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。 虽然可以不使用 new 修饰符来隐藏成员,但将收到编译器警告。 如果使用 new 来显式隐藏成员,将禁止此警告。
- 对同一成员同时使用 new 和 override 是错误的做法,因为这两个修饰符的含义互斥。 new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏。 override 修饰符会扩展继承成员的实现。
- override
- 要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
- override 方法提供从基类继承的成员的新实现。重写的基方法必须与 override 方法具有相同的签名。
- 不能重写非虚方法或静态方法。 重写的基方法必须是 virtual、abstract 或 override 的。
- override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的访问级别修饰符。
- 您不能使用 new、static 或 virtual 修饰符来修改 override 方法。
- 在 Derived 的一个实例中调用 method 时,C# 编译器将首先尝试使该调用与最初在 Derived 上声明的 method 版本兼容。 重写方法不被视为是在类上进行声明的,而是在基类上声明的方法的新实现。 仅当
C# 编译器无法将方法调用与 Derived 上的原始方法匹配时,它才尝试将该调用与具有相同名称和兼容参数的重写方法匹配。
- virtual
- virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
- 默认情况下,方法是非虚拟的。 不能重写非虚方法。
- virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。
public abstract class A
{
public abstract void Do();
public virtual void DrawLine() { Console.WriteLine("A:DrawLine"); }
public virtual void DrawPoint() { Console.WriteLine("A:DrawPoint"); }
public virtual void DoWork() { Console.WriteLine("A:DoWork"); }
} public class B : A
{
public override void Do() { Console.WriteLine("B:DO"); }
public new void DrawLine() { Console.WriteLine("B:DrawLine"); }
public override void DrawPoint() { Console.WriteLine("B:DrawPoint"); }
public override void DoWork() { Console.WriteLine("B:DoWork"); }
} public class C : B
{
public sealed override void DoWork() { Console.WriteLine("C:DoWork"); }
} public class D : C
{
// Attempting to override DoWork causes compiler error CS0239.
//public override void DoWork() {}
public new void DoWork() { Console.WriteLine("D:DoWork"); }
} // Only accessible within the same assembly
internal class MyInternalClass
{
public string Value { get; set; }
} //public sealed class MySealedClass { }
//public class Derived : MySealedClass { } // error CS0509: '': cannot derive from sealed type interface I
{
void M();
}
abstract class AC : I
{
public abstract void M();
} public class Base
{
public virtual void DoWork(int param) { Console.WriteLine("Base:DoWork(int)"); }
} public class Derived : Base
{
public override void DoWork(int param) { Console.WriteLine("Derived:DoWork(int)"); }
public void DoWork(double param) { Console.WriteLine("Derived:DoWork(double)"); }
} A a = new B();
a.DrawLine(); // output A:DrawLine
a.DrawPoint(); // output B:DrawPoint
a.Do(); // output B:DO D d = new D();
d.DoWork(); // output D:DoWork
C c = (C)d;
c.DoWork(); // output C:DoWork
B b = (B)d;
b.DoWork(); // output C:DoWork int val = 5;
Derived der = new Derived();
der.DoWork(val); // Calls DoWork(double).
((Base)der).DoWork(val); // Calls DoWork(int) on Derived.
Modifiers: virtual, override, new, abstract, sealed, internal的更多相关文章
- c#中的 virtual override 和abstract 以及sealed
1.如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法,而不能覆盖. 2.如果父类方法加了virtual关键字,即它是一个虚方法,在子类中一样可以隐藏. 3.如果子类 ...
- C#基础知识系列七(base、this、new、override、abstract、virtual、static)
前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...
- C#基础知识(base、this、new、override、abstract、virtual、static)
前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...
- base、this、new、override、abstract、virtual、static
前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...
- C#关于private protected sealed Virtual/Override
Public:公开权限 Private:修饰类时类为程序集或者包含此类的类内部权限:修饰变量时只能类内部使用: Protected:修饰变量,只能继承类可以使用,对外(包括继承类的实例)无权限: Ab ...
- C# abstract virtual override new finally java final finalize
virtual:声明虚方法.可以被其派生类所重写的.重写方法需要使用override或者new关键字. override:覆盖原方法.可对重写virtual.override.abstract进行重写 ...
- abstract,virtual,override个人
1.abstract 可以修饰类和方法,修饰方法时只声明不实现: 2.继承实现abstract类必须通过override实现abstract声明的方法,而virtual方法可选择override(重写 ...
- abstract,virtual,override
1.abstract 可以修饰类和方法,修饰方法时只声明不实现: 2.继承实现abstract类必须通过override实现abstract声明的方法,而virtual方法可选择override(重写 ...
- virtual方法和abstract方法
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
随机推荐
- 本机搭建外网web服务器
版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 首先声明一下楼主是个开发人员,按理说这些搭建服务器什么的,和楼主半毛钱的关系都没有.但是呢,楼主是个爱学习的人,懂得德智体全面 ...
- 计算hashCode的常见方法
把某个非零常数值,比如说17,保存在一个叫result的int类型的变量中. 2.对于对象中每一个关键域f(值equals方法中考虑的每一个域),完成以下步骤: a.为该域计算int类型的散列吗c: ...
- java并发编程_CountDownLanch(倒计数锁存器)应用场景
使用介绍: 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在 ...
- java基础知识点复习
第一天: JRE.JDK是什么? Jre java运行环境.Jre = java虚拟机+核心类库(辅助java运行的文件) Jdk:java开发工具集jdk = jre+java的开发工具 2. 配置 ...
- python生成中文验证码,带旋转,带干扰噪音线段
# -*- coding: utf-8 -*- """ Created on Sun Oct 4 15:57:46 2015 @author: keithguofan & ...
- pt-query-digest查询日志分析工具
1.工具介绍 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcp ...
- ecshop的弊病和需要修改的地方,持续更新
ecshop的session机制是基于cookie的,用数据库进行缓存,当浏览器关闭cookie,sessions表会爆表,所以需要改进. 在cls_template.php中 $_echash值是固 ...
- 使用css3中calc()进行自适应布局
calc()能做什么? calc()可以通过计算得到元素的宽度或者高度,让我们很容易进行自适应布局. 你可以为一个div元素,使用百分比.em.px和rem单位值计算出其宽度或者高度,比如说“widt ...
- Web前端之CSS_day1-2
1.div和span div的语义是division“分割”: span的语义就是span“范围.跨度” div标签是一个容器级标签,里面什么都能放,甚至可以放div自己 span是一个“文本级”的标 ...
- mysql分区查询
SELECT *FROM INFORMATION_SCHEMA.partitions WHERE table_name='表名' and table_schema='数据库名'