基类与接口混合继承的声明问题

1. 问题初现

今天,查看《接口继承的声明问题》一文的反馈,发现Ninputer留下这样一道题:

如果有

class A : Interface1

那么

class B : A, Inteface1

class B : A

会出现什么不同的情况呢。编译器在IL级别是用什么手段实现这个功能的呢?

2. 探索问题 & 理解问题

解决问题的过程既是一个探索的过程也是一个推理论证的过程。OK,下面我尝试用反证法来探索这个问题。

首先,我假设问题中B类的两种继承方式有着一样的效果,并试着寻找它们的不一样。为了了解这两种方式的效果,我把上面代码补充完整:

interface IC { }
class A : IC { }
class B1 : A { }
class B2 : A, IC { }
class Program
{
  static void Main()
  {
    A a = new A();
    B1 b1 = new B1();
    B2 b2 = new B2();
    Console.WriteLine(a is IC);
    Console.WriteLine(b1 is A);
    Console.WriteLine(b1 is IC);
    Console.WriteLine(b2 is A);
    Console.WriteLine(b2 is IC);
  }
}

代码运行的结果是:

True
True
True
True
True

时间: 2024-08-13 15:29:08

基类与接口混合继承的声明问题的相关文章

基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)

好久没发帖子了,又加了不少的功能呀.(图片仅是测试,不代表什么表情.) 本来我也想写一个2007的总结的,但是看到很多人都写了,我就不凑热闹了,写点和代码有关系的吧. 写作原因: 1.在项目里做得最多的操作恐怕就是保存数据了,总是要写一大堆的代码,能不能简单一点呢?2005来了,似乎可以减少一些代码,但是03里怎么办呢? 2.基类.接口.策略模式,好多高手都讨论过了,但是都是理论上的,在实践中如何应用呢?在webform 里面又怎么使用呢? 目的: 1.做一个"控件"来应对各种表单的录

Microsoft .NET 中的基类继承

接口继承 创建抽象类时,请使用关键字 Interface 而不是 Class.为接口命名,然后定义需要子类实现的所有属性和方法.这是因为基类中没有可以实现的属性和方法,它只包含一般数据,而不包含方法.您所创建的只是一个合约,它规定所有使用此接口的子类都必须遵循一定的规则. 1.        现在,请在已创建的项目中添加一个新类. 2.        从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类). 3.        在类中添加以下

C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义

类型判断符号:   C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 instanceof 符号判断   类与接口的继承:    C#:public class MDataRow : List<MDataCell>, IDataRecord, ICustomTypeDescriptor Java:public class MDataRow extends ArrayLi

(一三六)基类——第十三章

OOP编程的主要目的之一是提供可以重用的代码(比如类,可以反复使用).   C++有类库.类库由类声明和实现构成.因为类组合了类数据表示和类方法,因此提供了比函数库更加完整的程序包(函数库里的函数,也可以放置在类中作为类方法). 例如,单个类就可以提供用于管理对话框的全部资源.   类库 通常是以源代码的方式提供的(传统的C函数库则是以函数库的形式,往往没有源代码).   C++提供了比修改代码更好的方式来扩展和修改类,这种方法叫做 类继承.   类继承可以从已有的类派生出新的类,而派生类继承了

(一四一)抽象基类

抽象基类(abstract base class,简称ABC).   抽象基类的前提是,类方法里有 纯虚函数(pure virtual function). 纯虚函数需要在函数声明的结尾处添加"=0".   当一个类有了纯虚函数之后,它就成为了一个抽象基类. 抽象基类的特点是,不能创造该类的对象.   例如B类和C类的有一定的共同点,把这些共同点(数据成员和方法)抽象出来,创建一个A类,而B类和C类都从A类派生出来.而A类有一个纯虚函数,因此A类就成为了一个抽象基类.   对于纯虚函数

C++中的纯虚函数(pure virtual) 和抽象基类(abstract base class)

纯虚函数(pure virtual), 是一个基类中的方法, 仅仅是声明, 而不包括定义, 是一个泛化概念(general concept); 是把相应的虚函数, 末尾添加"=0",该虚函数就变为纯虚函数, 可以不用添加定义; 如果是其他虚函数, 即使不使用, 也必须定义(define); 包含纯虚函数的基类, 是抽象基类(abstract base class),不能定义(define)对象(object), 仅可以作为继承使用; 代码: /* * CppPrimer.cpp * *

详解C++中基类与派生类的转换以及虚基类_C 语言

C++基类与派生类的转换 在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生类才是基类真正的

BlogEngine.Net架构与源代码分析系列part12:页面共同的基类

BlogBasePage 上一篇文章我向大家展示了BlogEngine.Net中Theme的原理和一些开发规范,里面有很多内容和这篇文章有着联系,建议大家这两篇文章结合在一起看,这样效果会更好.在这篇文章中我主要向大家说明BlogBasePage,PostViewBase,CommentViewBase这三个类的内部实现上的一些技巧以及它们与页面,文章和评论之间是如何组织在一起的,希望对大家阅读这部分代码有帮助. 认识一下它们 BlogBasePage,PostViewBase,CommentV

如何XML序列化继承接口、基类的类对象

问题描述 在序列化MySerializableDictionary时会提示TherewasanerrorgeneratingtheXMLdocument.,(Rule类继承至基类Abrule).当rule类不继承任何类.接口时序列化正常.publicclassMySerializableDictionary<TKey,TValue>:Dictionary<TKey,TValue>,IXmlSerializable{#regionIXmlSerializableMemberspubl