在C#中要实现一个类继承类同时实现接口多个父类有什么办法

C#中子类重写父类方法的几种情况(virtual,abstract,override,new) - jinsikui的专栏 - CSDN博客
我的图书馆
C#中子类重写父类方法的几种情况(virtual,abstract,override,new) - jinsikui的专栏 - CSDN博客
研究了一下C#中子类重写父类方法的几种情况,关键字:virtual、abstract、override、new。
virtual:标识可能但不是必须被子类重写的方法,父类必须给出默认实现,子类可以重写(使用override,new,或无特殊标识的普通方法),也可以不重写该方法。
abstract:标识必须被子类重写的方法,父类不给出实现,子类必须用override关键字重写该方法。
override:标识重写父类的方法,父类方法必须是用abstract,virtual,override之一声明,运行时将根据实例的类型而不是引用的类型调用对象的方法。
new:标识重写父类的方法,父类方法可以用virtual、override、new之一声明,也可以是没有特殊标识的普通方法,运行时会根据引
用的类型选择调用父类还是子类的方法,重写父类方法时,使用new关键字与使用没有特殊标识的普通方法是等效的,但是后者会给出一个编译警告。
下面的表格总结了子类重写父类方法的各种情况(Class B继承自Class A,重写了A的Test()方法):
TA的推荐TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢C#的多继承问题!!想继承两个父类!!父类都已实现(不用接口实现)-CSDN论坛
C#的多继承问题!!想继承两个父类!!父类都已实现(不用接口实现)
我现在有两个类,类A和类B&我想同时用类C来继承他们,但是A和B都已经实现,我又不想重写,问怎么实现啊???(不想用接口,接口还的重新来写),C++有多继承,C#有没有什么快一点的方法啊???(我C#菜鸟)
不可多继承
哪有什么样的办法,让我的C类都能继承到A和B???(效果一样也可以)
怕累就没办法捏
更直接的说&我要继承的是两个系统提供的类,它具体怎么实现,我怎么知道啊,但我现在想用这两个类来组成一个新类,大家有没有什么好的方法啊??&先谢谢大家了
继承是不可能的。可以在c类中继承a类,在c类中定义一个public的b类的对象或属性。
B继承A,然后C继承B
恩&是不是这种形式啊??
&&&&&public&class&C:a
&&&&&&private&&b&myClassB&=&new&b();
&&&&&&&&public&void&fun()
&&&&&&&&&{
&&&&&&&&&&&&b.fun();
&&&&&&&&&}
是不是这样实现啊???&&我菜鸟,请大家关照啊
C#不支持多继承!基本常识啊。。。。
C#是不支持多继承的。
如果你不想重写类,并且只是不想重写方法而已,可以考虑使用组合的方式实现。
public&class&B1:B&//或者A1
&&&&public&B1&(&C&c&,...)&:base(...)
&&&&&&this.c=c;
&&&&private&C&c;
&&&&public&C&C
&&&&&&&get{return&c;}
public&calss&C:A&//或者B&视情况而定
&&&&public&C&(&...)&:base(...)
&&&&&&&&&&b1&=&new&B1(this,&...);
&&&&private&B1&b1;
&&&&public&&B1&B
&&&&&get{return&b1;}
&&&&//..把B的方法,成员&再声明一边
只是使用的时候稍微麻烦一点
&&&&//派生类转换为父类
&&&&A&a&=&new&C();
&&&&//B&b=&new&C();&//这里代码就不能这样写了
&&&&B&b&=&new&C().B;//应该这样写
&&&//父类转换为派生类
&&&C&c1&&=&a&as&C;
&&&C&c2&&=&(b&as&B1).C;
我第一个想到的和7楼一样
其实C#之所以不支持多类继承,是在推广对象组合。
组合从多种角度都要优于继承
怎么组合?&7楼的方法就是组合吗?
/ltp/archive//289628.html
对象组合的详细介绍,建议去看看
简单来说,组合就是把它包含进来
在C中包含A和B的对象,通过这些对象来进行操作
11楼解释好。循序继承会引起耦合度升高,内聚降低。
建议新建C.用适配模式引进来
public&class&C:A
&&private&B&b&=&new&B();
&&public&void&fun()
&&&&&b.fun();
用C++写一个,然后从C#里调用吧
建议使用对象组合
c#关闭了多重继承,让你使用接口来实现原来的多重继承
用:部分类&行不?
关键字:partial&
这样在编译时,会被编译成一个类文件
不过这两个类的名字要统一为一个
class&ParentOne&:&IParentOne
class&ParentTwo&:&IParentTwo
class&Child&:&IParentOne,&IParentTwo
&&private&IParentOne&parentO
&&private&IParentTwo&parentT
&&public&Child(ParentOne&parentOne,&ParentTwo&parentTwo)
&&{this.parentOne&=&parentO&this.parentTwo&=&parentT}
&&public&void&ParentOneMethod(param[]&obj)
&&{&return&(parentOne&as&ParentOne).ParentOneMethod(obj);&}
&&public&void&ParentTwoMethod(param[]&obj)
&&{&return&(parentTwo&as&ParentTwo).ParentTwoMethod(obj);&}
static&void&foo()
&&&Child&child&=&new&Child(new&ParentOne,&new&ParentTwo);
&&&child.ParentOneMethod();
&&&child.ParentTwoMethod();
&楼上要修正呀param[]&obj
用适配器模式,就是组合啦..
新写一个类,设置Private字段引用你需要用到的A,B类
创建Public方法,将需要用到的A,B类的方法包装起来,最好和A,B的方法声明相同,
这样使用起来就和直接使用A,B类的方法一样.
给你段具体的代码,首先声明我也是菜鸟,这也是我的一种学习方式,回答你的问题,自己动手试验.
不是为了抢分的,楼上的也是正确答案.
using&System.Collections.G
using&System.T
namespace&ConsoleApplication1
&&&&//想要实现多重继承Encoding类和StringBuilder类的效果
&&&&public&class&EncodingBuilder
&&&&&&&&private&Encoding&encoding&=&
&&&&&&&&private&StringBuilder&stringBuilder&=&
&&&&&&&&public&EncodingBuilder(Encoding&encoding,&StringBuilder&stringBuilder)
&&&&&&&&&&&&this.encoding&=&
&&&&&&&&&&&&this.stringBuilder&=&stringB
&&&&&&&&//这个方法包装了Encoding的&byte[]&GetBytes(String&text)&方法
&&&&&&&&public&byte[]&GetBytes(String&text)
&&&&&&&&&&&&return&this.encoding.GetBytes(text);
&&&&&&&&//这个方法包装了StringBuilder的&void&Append(Stirng&text)&方法
&&&&&&&&public&void&Append(string&text)
&&&&&&&&&&&&this.stringBuilder.Append(text);
&&&&&&&&//这个方法包装了StringBuilder的&string&ToString()&方法
&&&&&&&&public&override&string&ToString()
&&&&&&&&&&&&return&this.stringBuilder.ToString();
&&&&&&&&public&static&void&Main(String[]&args)
&&&&&&&&&&&&EncodingBuilder&eb&=&new&EncodingBuilder(Encoding.Default,&new&StringBuilder());
&&&&&&&&&&&&eb.Append("Hello&C#!");
&&&&&&&&&&&&byte&[]&bytes=eb.GetBytes(eb.ToString());
&&&&&&&&&&&&foreach&(byte&b&in&bytes)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Console.WriteLine(b);
&&&&&&&&&&&&}
可以考虑组合,不一定非要继承
&&&&别的什么都不用看,就看以下三位的:
&&&&12楼、28楼、31楼&
&&&&三位分别为您提供了三种实现,12楼用的方法类似于&Singleton设计模式,28楼巧妙的运用了接口的特性间接实现了多继承,31楼则是将所需要的类作为内部变量,然后提供方法来对这两个类的各自的方法进行封装提供给外部一个接口,他们各有各的特点,楼主可以自己体会一下。
经这一讨论,讨论出了新意..
直接在新的程序中,调用要继承的类不就完了
关联和依赖是同级的;组合是一种聚合,而聚合是一种关联;引用则是相对独立的
看看你们,把程序都写得那么复杂,就像把毛线搅成一团又胡拉乱扯.面向对象的软件,都必须不是面向对象的软件来支撑.真是很讨厌把什么方法都写到类里面,结果要必须搞个static出来让你在外面胡乱调用.
面向对象程序的入口是什么?就是从main这个static的函数(方法)胡乱调用开始的.前段时间&侯捷&老师的&mfc深入浅出&&为什么那么火?就是因为睿智如老先生能够让在面向对象里搅得晕头转向的苦行僧稍得神志清醒.
没想到几年后的今天,又看到大家一窝蜂往里面死钻.面向对象编程其实也不是不好,滥用则使你的程序东拉西扯,支离破碎.windows&api至今不用面向对象的方法设计.&
书也没看,就问这问题!
作个记号看你们东拉西扯!
简单的组合有时候根本无法满足需求,假如一个类中写了几十个方法,突然有一天这个类要变,难道要在包装类中挨个去换名字?
继承就没这个问题.随时变,随时换.
这个问题,如果你是在要面向对象,也用不着什么见鬼的继承.
为什么不把A类的&方法和数据成员&和&B类的&方法和数据成员&都拷贝到一起,建立C类?&就本问题而言ctrl+c&Ctr+v就是最好的继承,因为你永远无需考虑&A与C或B与C的一致性,难道不是这样?
能不抽象就无需抽象,简单的程序才是最好.
我们提倡学习抽象的编程思维,并不意味着解决每个问题都要使用抽象的方法.
我认为严谨的逻辑才是最重要的.
以前我就遇到过这样的事情,作了一个数据库转HTML树视图的类,其中,一个实现类实现了树视图的结构,然后有一个数据类继承于这个实现类并实现了一个数据填充接口,实现了从数据库向树视图的转换,但是后来我想写一个能够转XML的,就得将这个数据类单独拿出来.
但是此时原本是一个类,现在却变成了两个类,一个负责转换的逻辑,一个负责数据的填充.
我现在想写一个XML的逻辑都不能行,就因为无法多重继承(HTML树构建+数据&or&XML树构建+数据)
同意12楼的
回复本文意在巩固基础知识,并不是对其进行深入剖析,如若对各位高手没有什么作用,请绕过。
本文为原创文,所有示例均是博主测试过的,欢迎大家批评指正,如有转载请标明出处,谢谢。
继承、封装和多态是面向对象编程的重要特性。
其成员被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。
派生类隐式获得基类的除构造函数和析构函数以外的所有成员。
派生类只能有一个直接基类,所以C#并不支持多重继承,但一个基类可以有多个直接派生类。
继承是可以传递的。即:
如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。
&&&&&&&&public&void&Sum(int&i,int&j)
&&&&&&&&&&&&int&sum&=&i&+&j;
&&&&&&&&&&&&Console.WriteLine("I&am&A&,my&sum&={0}",sum);
&&&&class&B&:&A
&&&&&&&&public&void&Minus(int&i,int&j)
&&&&&&&&&&&&int&minus&=&i&-&j;
&&&&&&&&&&&&Console.WriteLine("I&am&B&,my&minus&={0}",&minus);
&&&&&&&&&&& this.Sum(3, 4);
&&&&class&InheritanceTest1
&&&&&&&&static&void&Main(string[]&args)
&&&&&&&&&&&&B&b&=&new&B();
&&&&&&&&&&&&b.Minus(3,&4);
&&&&&&&&&&&&Console.Read();
结果:I am B ,my minus=-1
&&&& I am A ,my sum = 7
试想一下,当基类Sum()方法是私有时,派生类还会继承该方法吗?
经过本人测试,没有在B类找到该方法,那么是不是它就没有被继承呢?其实不是的,私有成员其实已经被继承了,
但是它们却不可以被访问,因为私有成员只能被声明它们的类或结构体中才可访问,所以看上去像是没有被继承。
如果我们想降低访问基本,我们可以把基类Sum()方法定义为protected。
能够阻止某个类被其他类继承吗?
答案是可以的,C#提供了一个sealed 修饰符,此修饰符会阻止其他类从该类继承。
&&& sealed&class&A
&&&&&&&&int&
&&&&&&&&public&void&Sum(int&i,int&j)
&&&&&&&&&&&&int&sum&=&i&+&j;
&&&&&&&&&&&&Console.WriteLine("I&am&A&,my&sum&={0}",sum);
&&&&class&B&:&A&
&&&&&&&&public&void&Minus(int&i,int&j)
&&&&&&&&&&&&int&minus&=&i&-&j;
&&&&&&&&&&&&Console.WriteLine("I&am&B&,my&minus&={0}",&minus);
&&&&&&&&&&&&this.Sum(3,&4);&&&&&& //编译器会报错&&&&
&前面说过,派生类隐式获得基类的除构造函数和析构函数以外的所有成员。&那么我们该如何获得基类的构造函数和自身的构造函数呢?&我们知道基类的初始化工作由基类的构造函数完成,派生类的初始化工作则有派生类的构造函数完成,但是这样就产生了派生类构造函数的执行顺序问题。当基类没有构造函数,派生类也没有构造函数时,派生类新曾成员的初始化工作由其他公有函数来完成。&public&&class&A&&&&{&&&&&&&&int&test=0;&&&&&&&&public&void&sum()&&&&&&&&{&&&&&&&&&&&&test++;&&&&&&&&&&&&Console.WriteLine("I&am&test&={0}"&,test);&&&&&&&&}&&&&}&&&&class&B&:&A&&&&&{&&&&&&&&int&i;&&&&&&&&public&void&PrintInt()&&&&&&&&{&&&&&&&&&&&&i&=&3;&&&&&&&&&&&&Console.WriteLine("I&am&i&={0}",&i);&&&&&&&&}&&&&}&&&&class&InheritanceTest1&&&&&{&&&&&&&&static&void&Main(string[]&args)&&&&&&&&{&&&&&&&&&&&&B&b&=&new&B();&&&&&&&&&&&&b.PrintInt();&&&&&&&&&&&&Console.Read();&&&&&&&&}&&&&}结果:I am i=3 &如果只有派生类定义构造函数时,只需构造派生类对象即可。对象的基类部分使用默认构造函数来自动创建。当基类和派生类都定义有构造函数时,那么执行顺序会怎样呢?如果基类中是没有参数的构造函数,那么他可以隐式的被派生类执行,也就是说,派生类根本不需要包含构造函数如果基类中是没有参数的构造函数,在派生类中可以自定义有参数的构造函数public&&class&A&&&&{&&&&&&&&int&test=0;&&&&&&&&public&A()&&&&&&&&{&&&&&&&&&&&&test&=&5;&&&&&&&&&&&&Console.WriteLine("I&am&A&公有默认构造函数&,test={0}",&test);&&&&&&&&}&&&&}&&&&class&B&:&A&&&&&{&&&&}&&&&class&InheritanceTest1&&&&&{&&&&&&&&static&void&Main(string[]&args)&&&&&&&&{&&&&&&&&&&&&B&b&=&new&B();&&&&&&&&&&&&Console.Read();&&&&&&&&}&&&&}结果:I&am&A&公有默认构造函数&,test=5 由此可以看见,基类的构造函数被执行,在派生类中被调用。如果基类定义了带有参数的构造函数,那么此构造函数必须被执行,且在派生类中实现该构造函数,此时我们可以使用base关键字&&&&class&A&&&&{&&&&&&&&int&test=0;&&&&&&&&public&A(int&i)&&&&&&&&{&&&&&&&&&&&&test&=&i;&&&&&&&&&&&&Console.WriteLine("I&am&A&公有有参构造函数&,test={0}",&test);&&&&&&&&}&&&&}&&&&class&B&:&A&&&&&{&&&&&&&&public&B(int&j):base(j)&&&&&&&&{&&&&&&&&&&&&Console.WriteLine("I&am&B&公有有参构造函数,j={0}",j);&&&&&&&&}&&&&}&&&&class&InheritanceTest1&&&&&{&&&&&&&&static&void&Main(string[]&args)&&&&&&&&{&&&&&&&&&&&&B&b&=&new&B(1);&&&&&&&&&&&&Console.Read();&&&&&&&&}&&&&}结果:I am A 公有有参构造函数 ,test=1& && &&&& I am B 公有有参构造函数,j=1 &由此可见:
派生类隐式执行基类中带有参数的构造函数,在程序中基类定义了带有参数的构造函数,在其派生类中被继承,并使用base关键字调用基类中的构造函数来传送参数。
我们可以从代码中看到在创建派生类的对象后,程序首先运行的是基类的构造函数中的内容,然后才是派生类中的内容。如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造,并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。&
阅读(...) 评论()

我要回帖

更多关于 子类继承父类实现接口 的文章

 

随机推荐