c# 抽象类和接口的问题

「已注销」 2010-02-23 03:59:43
想约束一些类的内部结构,但是这些属性和方法都是私有的,所以就不能用接口了,接口都是公有的



但是,我要用到多重继承,只有接口可以多重继承,抽象类不能多重继承。。。



所以怎么解决呢?
...全文
188 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-02-24
  • 打赏
  • 举报
回复
那你的class1和class2是不是设计的不好。不要用平行的设计,而是让class1和class2都继承自classX,里面提供m1,m2,m3的纯虚函数,然后class1中,用默认方法实现m3,class2中默认方法实现m1,那继承class1的类就必须写m1,m2,继承class2的类必须写m2,m3了。

public abstract class classBase
{
protected abstract void m1(int i);
protected abstract void m2(string s);
protected abstract void m3(double d);
}
public abstract class class1 : classBase
{
protected override void m3(double d)
{
//do nothing
}
}
public abstract class class2 : classBase
{
protected override void m1(int i)
{
//do nothing
}
}
public class child1 : class1
{
}

这样编译时候就知道child1一定要实现那2个方法了。如果都要实现,那就继承自classBase.

只是这样看上去蛮别扭。
「已注销」 2010-02-23
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
interface也分internal和public,够用了。

至于多重继承,当初.net是学java的,就学会了这个。估计要等.net被2020年新的一代技术替代的时候,我们才能享受到真正的多重继承技术。现在就只好勉强用接口了。


interface 申明为 internal
外部是无法访问该接口,但是继承该接口的类依然后相应的方法
Joe-xXx 2010-02-23
  • 打赏
  • 举报
回复
引用 2 楼 lianshaohua 的回复:
会使用显式接口吗?把接口改为显式实现(默认的是隐式实现),这样如果别人不知道你的接口,就没有办法调用你接口的操作集了;


显示接口: void Iinterface.call(){}
dai746848136 2010-02-23
  • 打赏
  • 举报
回复
那个类是不能多重继承的啊,所有就用到接口啦!定义成protected就不至于公开了……
  • 打赏
  • 举报
回复
interface也分internal和public,够用了。

至于多重继承,当初.net是学java的,就学会了这个。估计要等.net被2020年新的一代技术替代的时候,我们才能享受到真正的多重继承技术。现在就只好勉强用接口了。
coldbird 2010-02-23
  • 打赏
  • 举报
回复
定义为 protected 就可以了。。。。。。
「已注销」 2010-02-23
  • 打赏
  • 举报
回复
引用 6 楼 caibingjiexin 的回复:
参考:
http://school.itzcn.com/video-vid-2414-spid-51.html
上面讲解的比较详细,希望对你有所帮助。



我理解,我这里有个矛盾,用抽象类,不能多重继承

用接口,不能定义为 私有
「已注销」 2010-02-23
  • 打赏
  • 举报
回复
好吧…… 我来仔细解释一下我想实现什么东西
我有3个方法
m1,m2,m3

然后有几个类

class1 实现了 m1 m2
class2 实现了 m2 m3

主要是做一定的约束

用接口很好实现


但是,我现在这些 m1,m2,m3是私有方法,不允许在外部调用

我这样做只是为了自己编写的方便,防止自己犯错误,而不是在外部调用的

bourbon1795 2010-02-23
  • 打赏
  • 举报
回复
推荐你看看 设计模式 这本书
你的问题,在这本书上有详细的解释
品铭工作室 2010-02-23
  • 打赏
  • 举报
回复
"想约束一些类的内部结构,但是这些属性和方法都是私有的,所以就不能用接口了,接口都是公有的 "
这个我不是很明白,接口与实现在访问修饰上没有关联

class CBase{}
interface IA
class CA : IA{}
class CB : CBase , IA
{
IA _IA = null ;
publi CB( IA ia ){ this._IA=ia; }
IA.aa(){ this._IA.aa(); }
}
ztenv 2010-02-23
  • 打赏
  • 举报
回复
会使用显式接口吗?把接口改为显式实现(默认的是隐式实现),这样如果别人不知道你的接口,就没有办法调用你接口的操作集了;
gouhan02 2010-02-23
  • 打赏
  • 举报
回复
你说的话不觉得矛盾吗?你要设计什么样的东西?

110,536

社区成员

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

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

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