C#接口多继承方法重名问题
最近实现一个功能需要继承两个接口,然而父类接口有这重名的方法,且方法实现一致。两个父接口均被多个子接口继承,并在类实例中实现。起初,我是通过new重名方法来实现我的功能调用。后被指正,在网上看了一个工友解决类似问题的方法,这里引用记录一下。
引自:http://www.cnblogs.com/xgw2004058/archive/2010/06/18/1760046.html
经常,一个类会实现多个接口,比如用户的一个控件继承自"IEdit"和"ICombo",每个接口无疑都有一个Paint方法来供子类实现如何画他们,但是多重继承就会出现问题,默认情况下,C#不允许实现Paint方法。
现在有一个比较钻牛角尖的问题,如何在派生的类里面实现这两个接口的相同名称的方法呢?
本文可参考 MSDN 配合理解
1。要么只实现一个方法,否则函数重明,就会存在二义性
2。如果确实想两个方法都实现,必须在接口的实现部分注意这么几点:
(1)。对有相同名称的方法在实现时,前面不能加public等关键词。每个方法前必须冠以相应的接口名。
比如:void IFace1.Print(){......};
void IFace2.Print(){......};
(2)。对于不同名称的方法,事项是前面必须冠以"public"标识符。
以上两个规则缺一不可,否则会收到编译错误。
3。创建类实例时,如何引用不同接口的相同方法呢?方法如下:
1。如果调用那个接口的实现,则必须将示例强制转换为相应接口类型。
比如:
FacetoFace face;
((IFace1)face).Print();
或者
((IFace2)face).Print();
完整的例子见下面
namespace TestInterface
{
/// <summary>
/// Class1 的摘要说明。
/// 本代码演示了C#中接口的基本特征,并检验了作者心中迷惑但是书中没有详细讲解的地方,比如接口多重
/// 继承时,多个父类接口有相同的方法时,派生接口如何定义、使用的问题
/// </summary>
interface IFace1
{
void Print();
void Hello();
}
interface IFace2
{
void Print();
void Goodbye();
}
class FacetoFace : IFace1,IFace2
{
#region IFace1 成员
void IFace1.Print()
{
Console.WriteLine("这是IFace1的Print函数");
}
public void Hello()
{
// TODO: 添加 FacetoFace.Hello 实现
Console.WriteLine("IFace1向您说Hello!");
}
#endregion
#region IFace2 成员
public void Goodbye()
{
// TODO: 添加 FacetoFace.Goodbye 实现
Console.WriteLine("IFace2向您说GoodBye");
}
void IFace2.Print()
{
Console.WriteLine("这是IFace2的Print函数");
}
#endregion
}
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
FacetoFace facetest1=new FacetoFace();
((IFace1)facetest1).Print();
((IFace2)facetest1).Print();
facetest1.Hello();
facetest1.Goodbye();
//
}
}
}
C#接口多继承方法重名问题的更多相关文章
- C#显示声名接口就是为了解决方法重名的问题
class class1 { public static void Main(string[] args) { Person ps = new Person(); ps.KouLan(); IFlya ...
- java 实现多个接口 方法重名的解决办法——内部类
package com.kk.innerClass; /** * 通过内部类实现接口 * 解决多个接口中方法重名问题 * */interface Machine { void run();} clas ...
- Python3基础 父,子类普通方法重名 子类方法覆盖父类方法
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 用mixin引入模块后, 方法重名的解析方法
关于mixin, 经常被问到一个问题是, 方法查找是如何处理的? 特别地, 如果类, 父类, 以及类所包含的mixin中, 都定义有相同名字的方法时, 会发生什么? 答案是, ruby首先会从对象的直 ...
- 关于js重名方法的先后调用问题
当js中方法重名时,最后引入的js会覆盖前面的引入的js(就是说会调用最后引入的js中的方法)详情参照(main.js与white.js 的a())但是,当最后一个js中存在语法上的错误时(也可以是本 ...
- JAVA_接口_默认方法&静态方法
1.小结(注意): 1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰 2.接口中,没有构造方法,不能创建对象 3.接口中,没有静态代码块 ...
- 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】
每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring ...
- 实习第一周第一天:接口 extends是继承类,implement是实现接口,原接口里面的方法填充,方法名也是不变,重写override是父类的方法名不变,把方法体给改了
一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...
- 在IE中,JS方法名和input的name重名时,调用该方法无效
在IE中,JS方法名和input的name重名时,调用该方法无效.提示:网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1 ...
随机推荐
- 大马提权详细过程webshell到提权
.在shell路径这一栏里输入服务器端cmd.exe对应的绝对路径,这里用我们刚刚上传上去的smallchao.exe 8.WINDOWS常见命令:net user 查看所有用户query user ...
- 添加Windows 10开机启动项:No Hyper-V
在Windows 10 1903版本加入了一项沙盒功能,1903版本以上的系统可以在控制面板-程序和功能-启用或关闭Windows功能中勾选Windows 沙盒选项,根据操作重启后即可打开沙盒功能. ...
- lnmp 一键安装包(nginx) 运行laravel项目显示该网页无法正常运行
vi /usr/local/nginx/conf/fastcgi.conf 注释掉 PHP_ADMIN_VALUE #fastcgi_param PHP_ADMIN_VALUE "open_ ...
- 前端每日实战:125# 视频演示如何用纯 CSS 创作一个失落的人独自行走的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqpOdR/ 可交互视频 此视频是 ...
- HTTP协议详解(深入理解)
版权声明:本文为CSDN博主「有抱负的小狮子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/weixin_ ...
- .NET Core 获取主机运行资源的库
简介 CZGL.SystemInfo 是一个支持 Windows 和 Linux 的资源信息获取库,用于获取系统环境.机器资源信息.系统资源使用情况. Nuget 搜索 CZGL.SystemInfo ...
- 前端劝退预警:JavaScript 工具链不完全指南
经过这么多年的发展,JavaScript 早已经不是当年那个不太起眼的脚本语言.如今的 JavaScript 可以说是风光无限,在 Web 前端.移动端.服务端甚至物联网设备上都大展身手,到处都有它的 ...
- unzip详解,Linux系统如何解压缩zip文件?
通常在使用linux时会自带了unzip,但是在最小化安装之后,可能系统里就无法使用此命令了. yum list unzip 查看是否安装 如果没安装过就继续 yum install unzip 安装 ...
- 「从零单排HBase 05」核心特性region split
HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制. 1.split触发时机与策略 前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后 ...
- vue+django+webpack搭建
一.前言 最近接手了一个项目,后端是django,前端是django自带的模板,用的是jinja2,写了一段时间发现用起来特别不顺手,于是想在保持现有的模板基础上,引入vue框架,这样同事可以继续用自 ...