C#多重继承

C#学习日记22---多重继承 继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类来定义一个类,一个类从另一个类派生出来时,派生类从基类那里继承特性          继承的思想实现了 属于(IS-A) 关系。例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A) 动物。 基类与派生类:     C#中派生类从他的直接基类继承成员,方法、属性、域、事件 阅读详情
myBase.cs

?
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespaceIntdv 
{ 
publicabstract classmyBase 
{
publicmyBase() 
{
//
// To do something here
//
}
}
} 

  myDerive1.cs

?
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespaceIntdv 
{ 
classmyDerive1 : Intdv.myBase 
{
stringmyName; 
publicmyDerive1() 
{
//
// To do something here
//
myName ="yarshary"; 
}
publicvoid ShowMyName() 
{
Console.WriteLine("my name is: "+ this.myName);
}
publicvoid reName(stringn) 
{
myName = n;
}
}
publicinterface ImyDerive1
{
voidShowMyName(); 
voidreName(stringn); 
}
} 

  myDerive2.cs

?
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespaceIntdv 
{ 
publicclass myDerive2:Intdv.myBase
{
intMyAge; 
publicmyDerive2() 
{
//
// To do something here
//
MyAge = 21;
}
publicvoid ShowMyAge() 
{
Console.WriteLine("my age is:"+ MyAge); 
}
publicvoid reAge(inta) 
{
this.MyAge = a;
}
}
publicinterface ImyDerive2
{
voidShowMyAge(); 
voidreAge(int a); 
}
} 

  myMDerive.cs

?
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespaceIntdv 
{ 
publicsealed classmyMDerive:Intdv.myBase, Intdv.ImyDerive1, Intdv.ImyDerive2
{
Intdv.myDerive1 d1;
Intdv.myDerive2 d2;
publicmyMDerive() 
{
//
// To do something here
//
d1 =new myDerive1();
d2 =new myDerive2();
}
publicvoid ShowMyName() 
{
d1.ShowMyName();
}
publicvoid reName(stringn) 
{
d1.reName(n);
}
publicvoid ShowMyAge() 
{
d2.ShowMyAge();
}
publicvoid reAge(inta) 
{
d2.reAge(a);
}
}
} 


其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在C#中实现多重继承,当时我答的很隐晦,因此这里我想补充说明一下.

首先,我要说明一下,C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interface来完成.可是大家都知道Interface实际上就是一个虚函数列表指针.内部封装的只有函数和属性.而且接口(Interface)不能实力化只能通过派生(因为没有构造函数)才可以使用.这一点和抽象类很类似,可是抽象类是个类,他有方法的实现.它所描述的对象是一个无法在现实中具现的对象,但它本身是个类对象.而接口实际上是一种标准.说了这么多,下面我来举一个例子如何在C#中实现多重继承.

myBase.cs

?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Intdv
{
public abstract class myBase
{
public myBase()
{
//
// To do something here
//
}
}
}

  myDerive1.cs

?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Intdv
{
class myDerive1 : Intdv.myBase
{
string myName;
public myDerive1()
{
//
// To do something here
//
myName = "yarshary" ;
}
public void ShowMyName()
{
Console.WriteLine( "my name is: " + this .myName);
}
public void reName( string n)
{
myName = n;
}
}
public interface ImyDerive1
{
void ShowMyName();
void reName( string n);
}
}

  myDerive2.cs

?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Intdv
{
public class myDerive2:Intdv.myBase
{
int MyAge;
public myDerive2()
{
//
// To do something here
//
MyAge = 21;
}
public void ShowMyAge()
{
Console.WriteLine( "my age is:" + MyAge);
}
public void reAge( int a)
{
this .MyAge = a;
}
}
public interface ImyDerive2
{
void ShowMyAge();
void reAge( int a);
}
}

  myMDerive.cs

?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Intdv
{
public sealed class myMDerive:Intdv.myBase, Intdv.ImyDerive1, Intdv.ImyDerive2
{
Intdv.myDerive1 d1;
Intdv.myDerive2 d2;
public myMDerive()
{
//
// To do something here
//
d1 = new myDerive1();
d2 = new myDerive2();
}
public void ShowMyName()
{
d1.ShowMyName();
}
public void reName( string n)
{
d1.reName(n);
}
public void ShowMyAge()
{
d2.ShowMyAge();
}
public void reAge( int a)
{
d2.reAge(a);
}
}
}

  

事例分析,首先我上在一开始定义了一个基类myBase,并派生出了两个派生类分别为myDerive1,myDerive2
这两个类分别定义了一组操作,myDerive1中定义了操作ShowMyName 和 reName 并通过接ImyDerive1加以
描述. myDerive2中定义了操作ShowMyAge 和 reAge 并通过接口ImyDerive2来描述,这样我在多重继承中
只用继承接口也就是ImyDerive1和ImyDerive2就可以保证操作列表的继承,操作的实现通过组合模型.在
接口方法中体现.这里还是从代码来说明,我的派生对象myMDerive(M即多从继承之意),虽然只继承了接口,
可是在构造函数中,却动态分配(New)了myDerive1 和 myDerive2 两个对象.并在操作ShowMyName 等接口继承来的操作中实际调用了myDerive1 和 myDerive2 的操作.由于myDerive1 和 myDerive2 是在
myMDerive内定义的,所以客户端代码(也就是我的主函数)并不需要管理对象的分配和释放(当然在CLR托管
环境中对象的释放一般也并非人为).

由以上例子,可以看出,实现借口留出函数接口具体实现通过组合的方式来实现多重继承中方法体的实现.这样既保证了单一继承父类的唯一性,又保证了多重继承的优点.我个人认为是个很不错的设计方法,并且在我的程序设计中很多地方都采用了该方法.那么好了,就到这里了.

C#实现多继承的三种方法(附完整源码) 阅读详情

相关推荐

C#基础教程19 接口与多继承

csharpCopy code// 接口成员的定义接口成员可以是方法、属性、事件或索引器。接口成员在定义时不能包含访问修饰符,因为接口成员默认为公共的。csharpCopy code该接口定义了两个成员:GetArea() 和 Draw() 方法。这些方法没有实现,因为接口只提供了成员的特征。接口是 C#中一种重要的抽象类型。接口定义了一组方法、属性和事件的特征,类和结构可以实现一个或多个接口,并实现接口中定义的所有成员。

qq_45800365的博客 684

C# —— 多继承

例如:c类可以继承与a类,a类可以继承b类。但是不能c类即继承于a类,同时继承于b类。接口里面只有声明没有赋值,那个类使用这个接口,就把对应的属性和方法进行实现。3 定义一个Man类 继承于People 同时继承IAnimal接口。C#不支持多重继承,但是可以通过接口实现多重继承。必须实现IAnimal里面的方法和属性。接口: 给类添加一些限制功能。1 : 首先创建一个People父类。2 :定义一个接口interface。4 最后在Main里面进行调用。

一个新人博客,愿多多支持。 1355

C#接口多继承的写法

INotifyCreated.Created和INotifyOwnerChanged.OnOwnerChanged就是两个不同接口,这种情况下,由于接口众多,那么出现接口函数命名重复的机率就会增多,导致编译不通过。这时就需要改写接口时,把接口名字也要写上去。由于接口继承比较多,那么在写代码的时候要注意什么呢?在这里看到这个类,它总共继承了5个接口。在函数的前面都写上了接口的名称。

大坡3D软件开发 648

C#中类的继承和实现多态的三种方法

访问修饰符 class 子类名称:父类名称//构造方法:方法名与类名一样,无返回类型 //创建对象的时候自动执行一次 public Person() {Console . WriteLine("PS:创建一个人的实例");//student是子类 person是父类 //从父类继承了成员和方法 } static void Main(string [ ] args) {//类的使用:创建他的对象实例 Person p = new Person();运行代码结果如下关键字virtual。

xxxiaoshu的博客 3571

C#中实现多继承的方法

近日看到了一个贴子,就是在C#语言中,如何实现多继承的问题。相信涉猎c#不多的人(像我这样的菜鸟),一看就觉得很可笑,c#肯定是不能实现多继承的啊。都知道在c++中因为实现多继承会有很多的歧义问题,所以在c#中就把多继承给取消了,而用接口来实现!但是想想,如果是初学者肯定不会不会问这样的问题。肯定是个高手,然后就开始上网查资料!然后发现真的可以实现! 说起多继承,首先大家可以想想这个问题:你知道在C#中怎么实现多继承吗? 主流的答案无非2种。 答案一:用接口啊,一个类可以继承自多个接口的。 答案二:C#不支持多继承,C++才支持多继承,多继承会让代码变得很乱,因此微软在设计C#的时候放弃了多继

用AI助手Cursor轻松自动生成流程图

通过 Cursor + Mermaid,我们可以快速、准确地自动生成流程图,上面演示的例子部分流程图可能比较丑,我们可以通过流程图软件导入Mermaid代码,然后手动进行微调就可以了,如果你对美观要求不是特别多,可以直接用,这将极大地提升代码可视化和架构设计的效率。

呱牛 Just do IT 1940

C#中多重继承

其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在C#中实现多重继承,当时我答的很隐晦,因此这里我想补充说明一下.首先,我要说明一下,C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interface来完成.可是大家都知道Interface实际上就是一个虚函数列表指针.内部封装的只有函数和属性.而且接口(Interface)不能实力化只能通过派生(

何双江(yarshray)的专栏 6491

CTF全能工具箱ProV2:集成AI与94GB离线资源库,打造无网环境下的智能解题流水线

CTF全能工具箱ProV2是一款专为线下CTF比赛设计的All-in-One离线解决方案。它集成了94GB的庞大离线资源库,涵盖Web、逆向、Pwn等全方向工具链与知识库,并创新性地内置了本地AI大模型,可在断网环境下提供智能解题辅助,实现从信息收集到漏洞利用的智能流水线作业,极大提升比赛效率。

weixin_29240343的博客 423

C# 通过接口实现多重继承

using System; using System.Collections.Generic; using System.Text; //通过接口实现多重继承 namespace interfaceDemo { class Person {//定义实体类 internal int age; internal string name; ...

不积跬步 无以至千里, 不积小流,无以成江海 1443

红外弱小目标检测:IPI算法解读及MATLAB复现

参考文献:[1]C. Gaoet al., “Infrared Patch-Image Model for Small Target Detection in a Single Image,” vol. 22, no. 12, pp. 4996–5009, 2013. 本文整理????论文笔记,并附MATLAB实现代码。 一、阅读笔记 1. 摘要 IPI算法是单帧检测算法; 利用背景的非局部子相关性(non-local self-correlation ofbackground),将目标检测转..

小草莓的魔法笔记 1万+

自举电容的工作原理-3句话总结

1、一道面试题 照例,先抛出来一道面试题:“Buck电路的SW引脚通常会放置一颗小电容,这颗电容有什么用?”。这个问题问得比较细,非常考验被面试者的硬件基本功。 2、似懂非懂的答案 有小伙伴可能不太清楚这颗电容的作用,回答不上来。也有小伙伴脱口而出:自举电容,用来做升压的。但后面好像说不出来具体逻辑。 没具体了解过,答不上来,也没啥可惜的。但是了解过一点,但又似懂非懂的这种,给出的答案只是轻轻点水或者千篇一律,那无疑是错过了一个加分项。 3、异步Buck的自举环路组成 既然是针对Buck电路讲自举电容,前面

ltqdxl的博客 3万+

C#支持多重继承么?

C#支持多重继承么? a. 类之间不支持,接口之间支持 b. 类对接口叫做实现,不叫继承

love_programmer的博客 1102

磁感应强度B、磁场强度H、矢量磁位A的study

学完电磁场很久了但是对电磁场中磁感应强度B⃗\vec{B}B、磁场强度HHH、矢量磁位A⃗\vec{A}A,这几个变量所表征的含义一直很模糊,所以就总结了一下

sinat_42386289的博客 1万+

c#继承、多重继承

c#类 1、c#类的继承 在现有类(基类、父类)上建立新类(派生类、子类)的处理过程称为继承。派生类能自动获得基类的除了构造函数和析构函数以外的所有成员,可以在派生类中添加新的属性和方法扩展其功能。继承的特性: 可传递性:C从B派生,B从A派生,那么C不仅继承B也继承A。 单一性:只能从一个基类中继承,不能同时继承多个基类继承中的访问修饰符base和this关键字基类的构造函数和析构函数不能被...

weixin_30468137的博客 469

ORB-SLAM2算法4之KITTI开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

ORB-SLAM2算法1 已成功编译安装ORB-SLAM2到本地,本篇目的是用KITTI开源数据来运行ORB-SLAM2,并生成轨迹,最后用evo评估工具来评估ORB-SLAM2生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 2326

【数据集】米级别热红外卫星合集:SDGSAT-1、HotSat-1等

米级别热红外卫星合集:SDGSAT-1、HotSat-1等

WW、forever的博客 1252

c#多重继承

其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在C#中实现多重继承,当时我答的很隐晦,因此这里我想补充说明一下. 首先,我要说明一下,C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interface来完成.可是大家都知道Interface实际上就是一个虚函数列表指针.内部封装的只有函数和属性.而且接口(Interface)不能实力化只能通过派

For The Future 1200

基于IEEE39节点系统的风力发电机组并网改造与稳定性研究

本文研究了基于IEEE39节点系统的风力发电机组并网改造与稳定性问题。首先将系统工作频率从60Hz转换为50Hz,并对同步发电机、变压器、线路和负荷参数进行相应调整。随后将30、32、34、37号节点的同步发电机替换为不同容量的永磁同步发电机(PMSG)和双馈感应发电机(DFIG),详细建立了两种风电机组的数学模型和控制策略。通过Simulink仿真验证,改造后的系统能够稳定运行并满足并网要求。研究成果为大规模风电并网系统仿真提供了参考,对提高电力系统可再生能源消纳能力具有重要意义。

huanghm88的专栏 111

C#多重继承与多继承

C#多重继承与多继承(多层次继承与多父类继承)

best_inh的专栏 2882

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# 面试问题大全:029:C# 支持多重继承吗?

虽然C#不支持传统的多重继承,但它通过接口和抽象类提供了灵活的替代方案来实现类似的功能。通过合理使用接口和抽象类,可以在保持代码清晰性和可维护性的同时,实现复杂的功能需求。

caifox的博客 1335

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C#面:C#支持多重继承么?

然而,C#提供了接口(interface)的概念来实现类似多重继承的功能。一个类可以实现多个接口,从而获得多个接口的特性和行为。接口定义了一组方法、属性和事件的契约,类可以通过实现接口来遵循这个契约,并获得接口中定义的成员。C#不支持多重继承。在C#中,一个类只能直接继承自一个基类。这是由于C#的设计目标之一是避免多重继承可能带来的复杂性和潜在的问题。

那个那个鱼的博客 1082

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C#中的多重继承

在C#语言中是没有多重继承功能的,如果我们在项目应用需要用多重继承来实现一些功能的时候,也还是可以做到的,虽然不是太方便。在C#语言中,类是不能多重继承的,但是接口可以多重继承。因此在此实现多继承的原理就是,为每个类建立具有相同方法名的接口,并实现这些接口,然后在子类中继承这些接口,并将实现的类作为子类的字段。 开发环境:VS2005 .NET2.0 项目下载地址:MuiltExtends...

weixin_30886233的博客 302

C++与C#对比学习:多重继承

我们知道C++中类可以多重继承,这也符合现实情况,比如某个绿帽高戴的男同志身边的某位美女可能同时具备几个身份,老婆,小三,孩子他妈.这样的话这位美女得同时继承这三个类.不过由于多继承会有一些缺陷,比如二义性.而且虽然多继承方便直观点,但没有它也不是不行.其实少了类少了面向对象也不是就做不了啥事,像C语言没有类还不是用的好好的.所以啊这个世界上很多事并不是那么必不可不少的.比如你明天光荣牺牲了这个世

weiwenhp 2542

[转]C#中多重继承

原文地址: http://blog.youkuaiyun.com/yarshray/article/details/14824 写的挺不错的,浅显易懂。 其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在C#中实现多重继承,当时我答的很隐晦,因此这里我想补充说明一下. 首先,我要说明一下,C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interfac...

weixin_30815469的博客 246
上一篇: static,const,auto各个关键字的作用域和用法
下一篇: 朋友,请不要焦虑
normal_cai
博客等级 码龄18年 12粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值