C#类继承和接口继承时一些模棱两可的问题[转]
原文地址:http://www.cnblogs.com/harleyhu/archive/2012/11/29/2794809.html
1.在father定义的方法若含有virtual关键字,child继承后并且使用override重写这个方法,
那么当father f= new child();的时候,f操作的这个方法将是child的.
2.接上,若child继承后只是用new 该方法而不是override,那么father f = new child()时,
发操作的这个方法是father上的.
3.接口里定义的方法在被father(第一级)继承后,若在father中没有使用virtual关键字修
饰方法,那么该方法将不能被child继承,child继承father,必须用new来重新实现接口中的方
法. 若要用接口来引用child,child必须继承该接口
4.接上,father中实现了接口方法且用了virtual关键字,child可以使用override来重写它,
5.当father实现接口方法而没有用 virtual关键字,child也继承接口并且用new实现接口方法
,用Interface强制转化father和child的时候, father f = new child();
f.Dispose();//调用的是father.
((father)f).Dispose();//调用的是father.
((IDisposable)f).Dispose();//调用的是child.
6.当father实现接口且用virtual关键字,child并且overide接口方法,此时child可以不用继
承接口,当然继承也没事
father f = new child();
f.Dispose();//调用的是child
((father)f).Dispose();//调用的是child.
((IDisposable)f).Dispose();//调用的是child.
7.当father实现接口没用virtual,child用new实现接口方法,但是child没有继承接口
father f = new child();
f.Dispose();//调用的是father
((father)f).Dispose();//调用的是father .
((IDisposable)f).Dispose();//调用的是father .,特殊注明,因为child被
IDisposable转化时,只能最多到father哪里,因为child不直接继承此接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication2
{
interface IInterface
{
void Method();
} class BaseClass : IInterface
{
public virtual void Method()
{
Console.WriteLine("BaseClass Method()...");
}
} class InheritClass : BaseClass
{
public override void Method()
{
Console.WriteLine("Inherit Method()...");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
InheritClass ic = new InheritClass();
bc.Method();
ic.Method();
IInterface iif = new BaseClass();
iif.Method();
IInterface iif2 = new InheritClass();
iif2.Method();
Console.ReadKey();
}
}
}
C#类继承和接口继承时一些模棱两可的问题[转]的更多相关文章
- PHP类继承、接口继承关系概述
PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &quo ...
- Python学习第十八课——继承,接口继承等
1.继承:字面意思 # 继承 : 字面意思 class father: pass class grandfather: pass class children(father): # 单继承 pass ...
- Effective C++ 笔记:条款 34 实现继承和接口继承
Differentiate between inheritance of interface and inheritance of implementation. 行为含义 声明一个pure virt ...
- php中类继承和接口继承的对比
PHP类继承: 1.PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &q ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- python开发面向对象基础:接口类&抽象类&多态&钻石继承
一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...
- python定义接口继承类
zxq547 python定义接口继承类invalid syntax解决办法 1 2 3 4 5 6 7 class s_all(metaclass=abc.ABCMeta): #python ...
- java基础知识总结--继承和接口
什么是继承?什么是接口?他们之间的区别和联系是什么? 什么是继承? 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能.多个类中存在相同属性和行 ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
随机推荐
- 终端下vim无法输入问题解决
最近回归vim时发现会偶尔出现vim无法输入,但光标在动的情况,一度怀疑是spf13的问题,后来经搜索,才发现是因为vim下,快捷键 Ctrl+s 的功能是停止输入,在IDE下编程时间长了,都有潜意识 ...
- ppt - 常规策划
1 比较图2 progress3 目标 proposal4 market leadership5 分析 - 设计 - 开发 - 实施 - 评估6 innovation7 时间区间表述8 阶梯式9 主 ...
- [.NET]二维码生成
又好一段时间没有写写东西了,继续回归原来的模式,多做记录,最近要实现个unity的二维码方面的功能,首先就要解决生成二维码的问题,这个倒是有这方面的组件,然后我通过强大的反编译工具Reflector( ...
- ajax传递array参数
var ticketId = new Array(); for(var i = 0; i < checkboxes.length; i++) { ticketId.push(checkboxes ...
- 解决VS+opencv中Debug版本与Release版本lib切换的问题
Author: Maddock Date: 2015-03-26 09:34:48 问题来源:http://bbs.csdn.net/topics/390733725 PS: 按照上述方法做的时候,在 ...
- .NET Remoting 体系结构 之 在 ASP.NET 中驻留远程服务器
迄今为止,所有服务器示例都是运行在自驻留(self-hosted)的.NET 服务器上.自驻留的服务器必 须手动启动..NET Remoting 服务器也可以在许多其他的应用程序类型中启动.在 Win ...
- JMeter中BeanShell实现写入文件
1.首先F:\test.txt文件为空
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
- Leetcode Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- html5和css3学习笔记
HTML5针对移动端,移动端的浏览器主要是chrome,是webkit内核; app(applicatin):应用; native app:原生的app sadsadsadad 单标签可以省略结尾标记 ...