C#的多继承问题!!想继承两个父类!!父类都已实现(不用接口实现)

tianrui456 2007-12-21 11:01:55
我现在有两个类,类A和类B 我想同时用类C来继承他们,但是A和B都已经实现,我又不想重写,问怎么实现啊???(不想用接口,接口还的重新来写),C++有多继承,C#有没有什么快一点的方法啊???(我C#菜鸟)
...全文
5944 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2010-12-18
  • 打赏
  • 举报
回复
eee.
zbking 2008-01-28
  • 打赏
  • 举报
回复
mark
jupiter911 2007-12-24
  • 打赏
  • 举报
回复
简单的组合有时候根本无法满足需求,假如一个类中写了几十个方法,突然有一天这个类要变,难道要在包装类中挨个去换名字?
继承就没这个问题.随时变,随时换.
GhostAdai 2007-12-24
  • 打赏
  • 举报
回复
作个记号看你们东拉西扯!
huoxudong125 2007-12-24
  • 打赏
  • 举报
回复
书也没看,就问这问题!
fckadxz 2007-12-24
  • 打赏
  • 举报
回复
看看你们,把程序都写得那么复杂,就像把毛线搅成一团又胡拉乱扯.面向对象的软件,都必须不是面向对象的软件来支撑.真是很讨厌把什么方法都写到类里面,结果要必须搞个static出来让你在外面胡乱调用.

面向对象程序的入口是什么?就是从main这个static的函数(方法)胡乱调用开始的.前段时间 侯捷 老师的<mfc深入浅出> 为什么那么火?就是因为睿智如老先生能够让在面向对象里搅得晕头转向的苦行僧稍得神志清醒.

没想到几年后的今天,又看到大家一窝蜂往里面死钻.面向对象编程其实也不是不好,滥用则使你的程序东拉西扯,支离破碎.windows api至今不用面向对象的方法设计.
parkersh 2007-12-24
  • 打赏
  • 举报
回复
同意12楼的
jupiter911 2007-12-24
  • 打赏
  • 举报
回复
我认为严谨的逻辑才是最重要的.
以前我就遇到过这样的事情,作了一个数据库转HTML树视图的类,其中,一个实现类实现了树视图的结构,然后有一个数据类继承于这个实现类并实现了一个数据填充接口,实现了从数据库向树视图的转换,但是后来我想写一个能够转XML的,就得将这个数据类单独拿出来.
但是此时原本是一个类,现在却变成了两个类,一个负责转换的逻辑,一个负责数据的填充.
我现在想写一个XML的逻辑都不能行,就因为无法多重继承(HTML树构建+数据 or XML树构建+数据)
fckadxz 2007-12-24
  • 打赏
  • 举报
回复
这个问题,如果你是在要面向对象,也用不着什么见鬼的继承.

为什么不把A类的 方法和数据成员 和 B类的 方法和数据成员 都拷贝到一起,建立C类? 就本问题而言ctrl+c Ctr+v就是最好的继承,因为你永远无需考虑 A与C或B与C的一致性,难道不是这样?

能不抽象就无需抽象,简单的程序才是最好.

我们提倡学习抽象的编程思维,并不意味着解决每个问题都要使用抽象的方法.

ada100 2007-12-23
  • 打赏
  • 举报
回复
直接在新的程序中,调用要继承的类不就完了
cxzhq2002 2007-12-23
  • 打赏
  • 举报
回复
经这一讨论,讨论出了新意..
yulinjie 2007-12-23
  • 打赏
  • 举报
回复


关联和依赖是同级的;组合是一种聚合,而聚合是一种关联;引用则是相对独立的
duying 2007-12-22
  • 打赏
  • 举报
回复
可以考虑组合,不一定非要继承
bwangel 2007-12-22
  • 打赏
  • 举报
回复
学习了
youzelin 2007-12-22
  • 打赏
  • 举报
回复
TO 楼主:

别的什么都不用看,就看以下三位的:

12楼、28楼、31楼

三位分别为您提供了三种实现,12楼用的方法类似于 Singleton设计模式,28楼巧妙的运用了接口的特性间接实现了多继承,31楼则是将所需要的类作为内部变量,然后提供方法来对这两个类的各自的方法进行封装提供给外部一个接口,他们各有各的特点,楼主可以自己体会一下。
intotheland 2007-12-22
  • 打赏
  • 举报
回复
给你段具体的代码,首先声明我也是菜鸟,这也是我的一种学习方式,回答你的问题,自己动手试验.
不是为了抢分的,楼上的也是正确答案.

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
//想要实现多重继承Encoding类和StringBuilder类的效果
public class EncodingBuilder
{
private Encoding encoding = null;
private StringBuilder stringBuilder = null;

public EncodingBuilder(Encoding encoding, StringBuilder stringBuilder)
{
this.encoding = encoding;
this.stringBuilder = stringBuilder;
}

//这个方法包装了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);
}
}
}
}

intotheland 2007-12-22
  • 打赏
  • 举报
回复
用适配器模式,就是组合啦..
新写一个类,设置Private字段引用你需要用到的A,B类
创建Public方法,将需要用到的A,B类的方法包装起来,最好和A,B的方法声明相同,
这样使用起来就和直接使用A,B类的方法一样.
gimse7en 2007-12-21
  • 打赏
  • 举报
回复
我第一个想到的和7楼一样
LutzMark 2007-12-21
  • 打赏
  • 举报
回复
对象组合
crossrowman 2007-12-21
  • 打赏
  • 举报
回复
聚合


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;
加载更多回复(26)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧