C#中abstract的用法详解

abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化,而且abstract修饰的成员在派生类中必须全部实现,不允许部分实现,否则编译异常. 如:

using System;
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
BClass b = new BClass();
b.m1();
}
}
abstract class AClass
{
public abstract void m1();
public abstract void m2();
}
class BClass : AClass
{
public override void m1()
{
throw new NotImplementedException();
}
//public override void m2()
//{
// throw new NotImplementedException();
//}
}
} 

Abstract classes have the following features:

抽象类拥有如下特征:

1,抽象类不能被实例化, 但可以有实例构造函数, 类是否可以实例化取决于是否拥有实例化的权限 (对于抽象类的权限是abstract, 禁止实例化),
即使不提供构造函数, 编译器也会提供默认构造函数;

2,抽象类可以包含抽象方法和访问器;

3,抽象类不能使用sealed修饰, sealed意为不能被继承;

4,所有继承自抽象类的非抽象类必须实现所有的抽象成员,包括方法,属性,索引器,事件;

abstract修饰的方法有如下特征:

1,抽象方法即是虚拟方法(隐含);

2,抽象方法只能在抽象类中声明;

3,因为抽象方法只是声明, 不提供实现, 所以方法只以分号结束,没有方法体,即没有花括号部分;如

public abstract void MyMethod();

4,override修饰的覆盖方法提供实现,且只能作为非抽象类的成员;

5,在抽象方法的声明上不能使用virtual或者是static修饰.即不能是静态的,又因为abstract已经是虚拟的,无需再用virtual强调.
抽象属性尽管在行为上与抽象方法相似,但仍有有如下不同:

1,不能在静态属性上应用abstract修饰符;

2,抽象属性在非抽象的派生类中覆盖重写,使用override修饰符;

抽象类与接口:

1,抽象类必须提供所有接口成员的实现;

2,继承接口的抽象类可以将接口的成员映射位抽象方法.

如:

interface I
{
void M();
}
abstract class C: I
{
public abstract void M();
}
抽象类实例:
// abstract_keyword.cs
// 抽象类
using System;
abstract class BaseClass // 抽象类
{
protected int _x = 100; //抽象类可以定义字段,但不可以是抽象字段,也没有这一说法.
protected int _y = 150;
public BaseClass(int i) //可以定义实例构造函数,仅供派生的非抽象类调用; 这里显式提供构造函数,编译器将不再提供默认构造函数.
{
fielda = i;
}
public BaseClass()
{
}
private int fielda;
public static int fieldsa = 0;
public abstract void AbstractMethod(); // 抽象方法
public abstract int X { get; } //抽象属性
public abstract int Y { get; }
public abstract string IdxString { get; set; } //抽象属性
public abstract char this[int i] { get; } //抽象索引器
}
class DerivedClass : BaseClass
{
private string idxstring;
private int fieldb;
//如果基类中没有定义无参构造函数,但存在有参数的构造函数,
//那么这里派生类得构造函数必须调用基类的有参数构造函数,否则编译出错
public DerivedClass(int p)
: base(p) //这里的:base(p)可省略,因为基类定义了默认的无参构造函数
{
fieldb = p;
}
public override string IdxString //覆盖重新属性
{
get
{
return idxstring;
}
set
{
idxstring = value;
}
}
public override char this[int i] //覆盖重写索引器
{
get { return IdxString[i]; }
}
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // 覆盖重写属性
{
 get
 {
  return _x + 10;
 }
}

public override int Y // 覆盖重写属性
{
 get
 {
  return _y + 10;
 }
}

static void Main()
{
 DerivedClass o = new DerivedClass(1);
 o.AbstractMethod();
 Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}

以上所述是小编给大家介绍的C#中abstract的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • c#中的interface abstract与virtual介绍

    interface用来声明接口1.只提供一些方法规约,不提供方法主体.  如: 复制代码 代码如下: public interface IPerson{    void getName();//不包含方法主体} 2.方法不能用public abstract等修饰,无字段变量,无构造函数.3.方法可包含参数.  如 复制代码 代码如下: public interface IPerson  {    void getAge(string s);  } 一个例子(例1): 复制代码 代码如下: pub

  • 深入解析C#中的abstract抽象类

    抽象类和类成员 通过在类定义前面放置关键字 abstract,可以将类声明为抽象类.例如: public abstract class A { // Class members here. } 抽象类不能实例化.抽象类的用途是提供一个可供多个派生类共享的通用基类定义.例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类来提供自己的类实现. 抽象类也可以定义抽象方法.方法是将关键字 abstract 添加到方法的返回类型的前面.例如: public abs

  • 深入理解C# abstract和virtual关键字

    复制代码 代码如下: class A { public virtual void Func() // 注意virtual,表明这是一个虚拟函数 { Console.WriteLine("Func In A"); } } class B : A // 注意B是从A类继承,所以A是父类,B是子类 { public override void Func() // 注意override ,表明重新实现了虚函数 { Console.WriteLine("Func In B")

  • C#中abstract的用法详解

    abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化,而且abstract修饰的成员在派生类中必须全部实现,不允许部分实现,否则编译异常. 如: using System; namespace ConsoleApplication8 { class Program { static void Main(string[] args) { BClass b = new BClass(); b.m1(); } }

  • Java中instance的用法详解

    关于对象的实例化 大家想到的通常是直接new,除了这个,还有些单实例模式,层次间调用等等 getInstance的使用: * 在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引用,即内存中有一块区域专门用来存放静态方法和变量, * 可以直接使用,调用多次返回同一个对象. getInstance 和 new的区别: 大部分类都可以用new,new就是通过生产一个新的实例对象,或者在栈上声明一个对象,每部分的调用 *都是用的一个新的对象 getInstance在单例

  • Java中的MapStruct用法详解

    目录 1 MapStruct配置 2 原理&性能 2.1 实现原理 3 使用方法 3.1 转换器的检索 3.1.1 使用Mappers工厂获取 3.1.2 通过依赖注入的方式获取 3.2 简单映射 3.2.1 基本映射 3.2.2 多源参数映射 3.2.3 更新对象 3.3 数据类型转换 3.3.1 对于基础数据类型会进行自动隐式的转换 3.3.2 指定转换格式 3.3.3 属性为复杂对象的映射 3.3.4 自定义转换器 3.3.5 使用限定符限定使用转换方法 3.4 Map的映射 3.5 枚举

  • 基于C++中setiosflags()的用法详解

    cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2); setiosflags 是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是执行由有参数指定区域内的动作:   iso::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧:   iso::right 也是se

  • Angular 中 select指令用法详解

    最近在angular中使用select指令时,出现了很多问题,搞得很郁闷.查看了很多资料后,发现select指令并不简单,决定总结一下. select用法: <select ng-model="" [name=""] [required=""] [ng-required=""] [ng-options=""]> </select> 属性说明: 发现并没有ng-change属性 ng-

  • java 中 ChannelHandler的用法详解

    java 中 ChannelHandler的用法详解 前言: ChannelHandler处理一个I/O event或者拦截一个I/O操作,在它的ChannelPipeline中将其递交给相邻的下一个handler. 通过继承ChannelHandlerAdapter来代替 因为这个接口有许多的方法需要实现,你或许希望通过继承ChannelHandlerAdapter来代替. context对象 一个ChannelHandler和一个ChannelHandlerContext对象一起被提供.一个

  • Java中isAssignableFrom的用法详解

    class1.isAssignableFrom(class2) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口.如果是则返回 true:否则返回 false.如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象,则该方法返回 true:否则返回 false. 1. class2是不是class1的子类或者子接口 2. Object是所有类的父类 一个例子搞定: package com.auuz

  • php 中的closure用法详解

    Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名字的函数.比如以下代码(文件名是do.php) <?php function A() { return 100; }; function B(Closure $callback) { return $callback(); } $a = B(A()); print_r($a);//输出:Fatal error: Uncaught TypeError: Argument 1

  • JavaScript中eval()函数用法详解

    eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行. 如果参数是一个表达式,eval() 函数将执行表达式.如果参数是Javascript语句,eval()将执行 Javascript 语句. 语法 复制代码 代码如下: eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句. eval()函数用法详解: 此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eva

  • C# 中string.split用法详解

    第一种方法 string s=abcdeabcdeabcde; string[] sArray=s.Split('c') ; foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab deab deab de 第二种方法 我们看到了结果是以一个指定的字符进行的分割.使用另一种构造方法对多个字 符进行分割: string s="abcdeabcdeabcde"; string[] sArray1=s.

随机推荐