虚方法和覆写方法

虚方法可以使基类的引用访问"升至"派生类中

可以使用基类引用调用派生类的方法,只需满足下面的条件

  • 派生类的方法和基类的方法有相同的签名和返回类型
  • 基类的方法使用virtual标注
  • 派生类的方法使用override标注
  class Program
{
static void Main(string[] args)
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
Console.ReadLine();
}
} class MyBaseClass //基类
{
virtual public void Print()
{
Console.WriteLine("基类");
}
} class MyDerivedClass : MyBaseClass //派生类
{
public override void Print()
{
Console.WriteLine("派生类");
}
}

上面代码阐明了virtual和override方法。

关于virtual和override的信息如下

  • 覆写和被覆写的方法必须有相同的可访问性
  • 不能覆写static方法或非虚方法
  • 方法,属性和索引器,事件都可以被声明为virtual和override

覆写标记为override的方法

  • 当使用对象的基类部分的引用调用一个覆写方法时。方法的调用被沿派生层上溯执行,一直到标记为override的方法的最高派生版本
  • 如果在更高的派生级别有该方法的其他声明,但没有被标记为override,那么它们不会别调用
class MyBaseClass  //基类
{
virtual public void Print()
{
Console.WriteLine("基类");
}
} class MyDerivedClass : MyBaseClass //派生类
{
public override void Print()
{
Console.WriteLine("派生类");
}
}
class SecondDerived : MyDerivedClass//最高派生类
{
//to
}

情况1:使用override声明print

如果把SecondDerived的Print方法声明为override,那么他会覆写方法的全部两个派生级别的版本

class SecondDerived : MyDerivedClass//最高派生类
{
public override void Print()
{
Console.WriteLine("第二派生类");
}
} static void Main(string[] args)
{
SecondDerived derived = new SecondDerived();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
Console.ReadLine();
}

情况2:使用new声明Print

 class SecondDerived : MyDerivedClass//最高派生类
{
new public void Print()
{
Console.WriteLine("第二派生类");
}
} static void Main(string[] args)
{
SecondDerived derived = new SecondDerived();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
Console.ReadLine();
}

覆盖其他成员类型

 class MyBaseClass  //基类
{
//virtual public void Print()
//{
// Console.WriteLine("基类");
//} private int _myInt = ;
virtual public int Myproerty
{
get { return _myInt; }
}
} class MyDerivedClass : MyBaseClass //派生类
{
//public override void Print()
//{
// Console.WriteLine("派生类");
//}
private int _myInt = ;
public override int Myproerty
{
get
{
return _myInt;
}
}
} static void Main(string[] args)
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
Console.WriteLine(derived.Myproerty);
Console.WriteLine(mybc.Myproerty);
Console.ReadLine();
}

构造函数的执行

要创建对象的基类部分,需要隐试调用基类的某个构造函数作为创建实例过程的一部分

继承层次链中的每个类在执行自己的构造函数体之前执行他的基类构造函数

 class MyBaseClass  //基类
{
public MyBaseClass()//2 基类构造函数调用
{ }
} class MyDerivedClass : MyBaseClass //派生类
{ int _myInt = ; //1 成员初始化
public MyDerivedClass() //3 构造函数体执行
{ } }

构造函数初始化语句

有两种形式的构造函数初始化语句

  • 第一种形式使用关键字base并指明使用哪一个基类构造函数
  • 第二种形式使用关键字this并指明应该使用当前类的哪一个构造函数

抽象成员

抽象成员是指被设计为被覆写的函数成员

抽象成员的特征

  • 必须是一个函数成员,也就是说,字段和常量不能为抽象成员
  • 必须用abstract修饰符标记
  • 不能有实现代码块。抽象成员的代码用分号表示

抽象成员只可以在抽象类中声明,一共有4种类型的成员可以声明为抽象的

  1. 方法
  2. 属性
  3. 事件
  4. 索引

抽象成员的其他注意事项

  • 尽管抽象成员必须在派生类中用相应的,但不能把virtual修饰符附加到abstract修饰符
  • 类似虚成员,派生类中抽象成员的实现必须指定override修饰符

抽象类

抽象类是指设计为被继承的类,抽象类只能被用作其他类的基类

  • 不能创建抽象类的实例
  • 抽象类使用abstract修饰符声明
  • 抽象类可以包含抽象成员或普通的非抽象成员。
  • 抽象类可以自己派生自另一个抽象类
  • 任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类
 abstract class AbClass //抽象类
{
public void A() //普通方法
{
Console.WriteLine("我是抽象类");
}
abstract public void B(); //抽象方法 } class MyDerivedClass : AbClass //派生类
{
public override void B()
{
Console.WriteLine("我是派生类");
} } static void Main(string[] args)
{
MyDerivedClass derived = new MyDerivedClass();
derived.A();
derived.B();
Console.ReadLine();
}

密封类

密封类只能被用作独立的类,它不能被用作基类

密封类使用sealed修饰符标注

静态类

静态类中所有的成员都是静态的。静态类用于存放不受实例数据影响的数据和函数。

  • 静态类必须标记为static
  • 类的所有成员必须是静态的
  • 类可以有一个静态构造函数,但不能有实例构造函数,不能创建类的实例
  • 静态类是隐试密封的,也就是说,不能继承静态类

扩展方法

扩展方法的重要要求如下

  • 声明扩展方法的类必须声明为static  
  • 扩展方法本身必须为static
  • 扩展方法必须包含关键字this作为他的第一个参数类型,并在后面跟着它所扩展的类的名称

[C#基础] 继承的更多相关文章

  1. python基础——继承和多态

    python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...

  2. python基础——继承实现的原理

    python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...

  3. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  4. 《Java基础——继承》

    Java基础--继承     一.类的继承: 规则: 1.一个子类只能有一个父类,但一个父类可以有多个子类,每个子类都可以作为父类使用. 2.若一个类没有声明父类,则默认其父类为Object. 3.父 ...

  5. OC基础--继承

    继承的基本概念: 现实生活中的继承: 人类是一个基类(也称做父类),通常情况下所有人类所共同具备的特性,如有手有脚能吃能喝 按照生活常规,我们继续给人类来细分的时候,我们可以分为学生类 工人类等,学生 ...

  6. Java基础--继承方法调用顺序

    最近因为面试的原因,回过头来复习基础的知识,都忘光了,准备买本面试书回来啃. 我先把自己测试的结论总结写出来,以后忘记再来看看 如果b类继承自a类,在main方法中new出b的对象(不带参数),那么他 ...

  7. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  8. python基础===继承

    编写类时,并非总是要从空白开始.如果你要编写的类是另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类的所 ...

  9. 03Java基础——继承

    1.继承 例如一个员工类,包括开发员工和经理. package cn.jxufe.java.chapter2.demo12; public class Employee { String name; ...

  10. Java 基础 - 继承

    子类继承父类的private字段么? Oracle的Java Documentation对Inheritance的定义: 很直白,定义里面就告诉你了这不叫继承.继承的意思是你可以对其进行直接的调用和修 ...

随机推荐

  1. Multiple bindings were found on the class path(转)

    Multiple bindings were found on the class path SLF4J API is designed to bind with one and only one u ...

  2. OGR – Merging Multiple SHP files

    So I have 25 shapefiles with data for 25 counties, and I want to merge them all into one shapefile. ...

  3. Swift - 如何实现字符串的HMAC_SHA1加密

    前段时间有个网友问是否有Swift的HMAC_SHA1算法.这次就专门写篇相关文章进行介绍.要说明HMAC-SHA1,首先要先了解什么是HMAC,什么是SHA. 1,HMAC(散列消息身份验证码:Ha ...

  4. 利用Ihttpmodel实现网站缓存,解决Server.Transfer 直接输出HTML源代码的问题

    今天在用.NET利用IHttpModel实现网站静态缓存的时候,不知道最后为什么用 Server.Transfer(html)的时候结果输出的是HTML的源代码. 贴上源代码 using System ...

  5. exe4教程

    exe4j_windows-x64_5_0_1.exe <?xml version="1.0" encoding="UTF-8"?> <exe ...

  6. Git本地分支版本号过低导致的push错误 error: failed to push some refs to ... 及兴许amend

    今天在用git的时候遇到了一个问题.在想远程分支push的时候,出现了以下的错误: ! [remote rejected] master -> refs/for/master (change 1 ...

  7. 配置rhel 6.4(64位)安装使用syslog-ng 3.5

    我基本的博客地址是:www.cppblog.com/zdhsoft 相应的CentOS 6.x也就可能使用. 下载地址: 第一步:安装 wget http://www.balabit.com/down ...

  8. linux脚本: makefile以及链接库

    Linux makefile 教程 非常详细,且易懂 http://blog.csdn.net/liang13664759/article/details/1771246 //sort.c #incl ...

  9. log4net概述

    log4net概貌 log4net是一个框架,用来记录日志的框架.为什么要记录日志呢?每个程序员都不能保证自己的程序完全没有错误,可是当程序已经部署的时候出现错误怎么办?我们这时候就要根据我们的日志文 ...

  10. MYSQL查询表结构

    mysql查看表结构命令,如下: desc 表名;show columns from 表名;describe 表名;show create table 表名; use information_sche ...