protected abstract int Age { get; set; }
public abstract int this[int index] { get; set; }
public abstract event Action ChangeEvent;
class Man : People
internal override void Get() { }
protected override int Age { get; set; }
public override int this[int index]
get { return Age; }
set { Age = value; }
public override event Action ChangeEvent;
-
抽象只针对于 class,struct不能抽象
-
抽象成员只能存在于抽象类中(抽象类中的成员也可以不是抽象的)
-
可以抽象的成员有(方法、属性、索引器、事件),字段不能抽象
-
抽象成员必须标记为可以被子类访问的修饰(public、internal 或protected)
-
子类重写抽象父类中的成员时访问修饰符要一致
-
标记为抽象的成员是不能有实体的
二、虚拟(virtual)
//错误案例
class People
virtual void Get() { }
报错提示:CS0621 '“Program.People.Get()”: 虚拟成员或抽象成员不能是私有的
class People
public virtual void Get() { }
protected virtual int Age { get; set; }
public virtual int this[int index]
get { return Age; }
set { Age = value; }
public virtual event Action ChangeEvent;
class Man : People
public override void Get() { }
protected override int Age { get; set; }
public override int this[int index]
get { return Age; }
set { Age = value; }
public override event Action ChangeEvent;
virtual 与 abstract 的异同点
- 都可以修饰的成员有(方法、属性、索引器、事件),字段不行
- 成员都必须标记为可以被子类访问的修饰(public、internal 或protected)
- 子类重写父类中的成员时访问修饰符要一致
- 子类中需重写的成员都要标记为 override
- abstract可以修饰于class,但virtual不行(只能修饰于成员)
- abstract只能存在于抽象类中,virtual抽象类和不是抽象的类都可以
- abstract修饰的成员不能有实体,但virtual必须有实体
- 在子类中,abstract成员必须重写,virtual可以不重写
三、密封(sealed)
class A { }
sealed class B : A { }
class C : B { }
报错提示:CS0509 “C”: 无法从密封类型“B”派生
class A
protected virtual void Get() { }
protected virtual void Set() { }
class B : A
protected sealed override void Get() { }
protected override void Set() { }
class C : B
protected override void Set() { }
protected override void Get() { }
报错提示: CS0239 “C.Get()”: 继承成员“B.Get()”是密封的,无法进行重写
- 应用于某个类时,
sealed
修饰符可阻止其他类继承自该类 - 对替代基类中的虚方法或属性的方法或属性使用
sealed
修饰符, 防止派生类替代特定虚方法或属性 - 将 abstract 修饰符与密封类结合使用是错误的,因为抽象类必须由提供抽象方法或属性的实现的类来继承
- 应用于方法或属性时,
sealed
修饰符必须始终与 override 结合使用
四、接口(interface)
//错误案例
interface IPeople
public void Get();
报错提示:CS8703 在 C# 7.3 中,修饰符 "public" 对此项无效。
interface IPeople
void Get();
class Man: IPeople
void Get() { } //错误
报错提示:CS0737 '“Program.Man”不实现接口成员“Program.IPeople.Get()”。“Program.Man.Get()”无法实现接口成员,因为它不是公共的。
interface IPeople
void Get();
int Age { get; set; }
int this[int index] { get; set; }
event Action ChangeEvent;
class Man : IPeople
public void Get() { }
public int Age { get; set; }
public int this[int index]
get { return Age; }
set { Age = value; }
public event Action ChangeEvent;
- interface命名一般以(I)开头
- 接口可以包含的成员有(方法、属性、索引器、事件),字段不行
- 接口中的成员不能有访问修饰符
- 接口中的成员不能实现实体
- 子类必须实现所有接口的成员
- 子类中接口成员都必须标记为public(不能带override)
警告 (2级) CS0114 方法覆盖了继承的同名方法,如果要重载,使用override修饰符,否则使用new修饰符
错误 CS0115 找不到合适的方法进行重载
错误 CS0116 名字空间不能直接包含域或方法等成员
错误 CS0117 类型中不能包含函数定义
错误 CS0118 构造函数名称应指代另一构造函数
错误 CS0119 构造函数名称指代的构造函数在当前环境中无效
virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。
它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的。毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的。
但是它们的区别很大。(virtual是“虚拟的”,abstract是“抽象...
public void IdentifyBase()//普通方法
{ Console.WriteLine("I am Abstract Class "); }
abstract public void IdentifyForDerived();//给派生类准备的抽象方法
我已经创建了以下类。但是,我无法克服这个错误:必须声明主体,因为它未标记为abstract、extern或分部分类如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.CompilerServices;namespace VDSORDAL{pu...
如果一个类不与具体的食物相联系,而只表达一种抽象的概念,仅是作为其派生类的一个基类,这样的类就是派生类,在抽象类中,声明抽象类中声明抽象方法是,如果加上abstract关键字则为抽象方法。abstract 修饰符可用于类、方法、属性、索引器和事件。
在类声明中使用abstract 修饰符以指示某个类只能是其他类的基类。
标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
通过在...
问题描述:在一个类里定义了另一个抽象类对象,在构造函数中使用new初始化抽象类对象报错:“无法创建抽象类或接口的实例”
public abstract class BInstrumentUnit
// 属性
class TipParam
private BInstrumentUnit m_LoadUnit; // 加载单元
public BInstrumentUnit()
m_LoadUnit= new BInstrumentUnit(); // 报..
总结起来,C#无法创建抽象类或接口的实例是因为它们都存在未实现的成员,无法提供完整的功能。只有具体实现了抽象类或接口的子类,才能提供这些缺失的成员并创建实例。C#中的抽象类和接口是两种重要的概念,它们在面向对象编程中扮演着关键的角色。接口也是一种类似于抽象类的概念,它定义了一组方法、属性和索引器的签名,但没有具体的实现。只有具体实现了抽象类或接口的子类,才能提供这些缺失的成员并创建实例。接着,我们实例化了一个继承自抽象类和实现了接口的子类,并调用了其中的方法。,然后创建了一个继承抽象类和实现接口的类。
//我们在密封一个方法的时候 此方法必须是重写的方法 即sealed和override进行搭配使用
//使用了sealed关键字的方法 在其他类进行对本类进行派生的时候 此方法将无法重写
//public sealed override void Test()
参考:http://www.cnblogs.com/HQFZ/p/4714686.html 、http://www.cnblogs.com/flyinthesky/archive/2008/06/18/1224774.html
http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 三篇大作。
Java虚拟机定义若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创...