一个类实现两个接口,如果以一个接口类型实例化这个类,想调用另一个接口提供的函数,是否只能转换类型或新建接口?

u010573778 2014-09-15 06:12:38
如题,代码如下:

public interface IA
{
void doA();
}

public interface IB
{
void doB();
}

public class C:IA,IB
{
void doA()
{
...
}

void doB()
{
...
}
}

现在我想这样:
IA c=new C();
c.doA(); //可以调用
但是
c.doB(); //不可以调用

目前想到的解决办法有:
1)
判断并用as运算符
if(c is IB)
{
(c as IB).doB();
}

2)
使用类型转换
IB c2=(IB)c;
c2.doB();

这样是否会占用新的内存空间呢?
3)
做一个新接口,
public interface IAExt:IA,IB
用class C来继承此接口并实现doA,doB两个方法;
public class C:IAExt
{
void doA()
{
...
}

void doB()
{
...
}
}
使用的时候
IAExt c=new C();
c.doA();
c.doB();
但是这样会多出很多本来不必要的重复接口,未实现别的功能,只是整合了一些接口而已。


PS 想了一下,好像良好设计的接口应该不会发生这种情况?
还是提出来大家讨论一下吧。。。
...全文
493 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010573778 2014-09-16
  • 打赏
  • 举报
回复
引用 7 楼 caozhy 的回复:
[quote=引用 5 楼 u010573778 的回复:] [quote=引用 3 楼 caozhy 的回复:] 应用程序的所有组件的代码始终不应该显式引用另一个组件中的类(无论是在声明中还是在 new 语句中)。 相反,应使用接口声明变量和参数。 这是说,如果你想创建可复用的,低耦合的组件,这是一种设计原则,但是这绝对不是编写一般应用程序的原则。
斑竹大大这么晚还工作啊。。。 我仔细研究了一下,好像他的意思是说不同的组件间要隔离,通俗点就是dll之间隔离是吧? 一个dll里面的类可以相互引用咯? 正规的开发模式是一个解决方案建几个项目啊?好像说有什么MVC三层,又有什么5层结构,又什么工厂结构的好复杂啊。。具体有什么区别啊?[/quote] 正规的模式是根据需要选择合适的设计,以及不断的重构,只有不正规的开发才强调一个教条而以不变应万变的所谓“模式”呢。[/quote] 好高深的样子啊。。。那斑竹大大觉得这样好不好,一个程序用mvc结构, m里面定义业务逻辑和实现具体操作,定义一个工厂类以给上层返回创建的对象,不让上层显示用new创建 v属于高层,定义c层需要实现的接口(方便实现依赖倒置),以接口进行实例化c,接收用户操作 c作为中层,定义m层需要实现的接口,用接口实例化m的内容,进行协调操作
threenewbee 2014-09-16
  • 打赏
  • 举报
回复
引用 5 楼 u010573778 的回复:
[quote=引用 3 楼 caozhy 的回复:] 应用程序的所有组件的代码始终不应该显式引用另一个组件中的类(无论是在声明中还是在 new 语句中)。 相反,应使用接口声明变量和参数。 这是说,如果你想创建可复用的,低耦合的组件,这是一种设计原则,但是这绝对不是编写一般应用程序的原则。
斑竹大大这么晚还工作啊。。。 我仔细研究了一下,好像他的意思是说不同的组件间要隔离,通俗点就是dll之间隔离是吧? 一个dll里面的类可以相互引用咯? 正规的开发模式是一个解决方案建几个项目啊?好像说有什么MVC三层,又有什么5层结构,又什么工厂结构的好复杂啊。。具体有什么区别啊?[/quote] 正规的模式是根据需要选择合适的设计,以及不断的重构,只有不正规的开发才强调一个教条而以不变应万变的所谓“模式”呢。
WM_JAWIN 2014-09-16
  • 打赏
  • 举报
回复
搞过毛,自己写着顺手就行了。什么三层五层的。都是用来装B的
u010573778 2014-09-16
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
应用程序的所有组件的代码始终不应该显式引用另一个组件中的类(无论是在声明中还是在 new 语句中)。 相反,应使用接口声明变量和参数。 这是说,如果你想创建可复用的,低耦合的组件,这是一种设计原则,但是这绝对不是编写一般应用程序的原则。
斑竹大大这么晚还工作啊。。。 我仔细研究了一下,好像他的意思是说不同的组件间要隔离,通俗点就是dll之间隔离是吧? 一个dll里面的类可以相互引用咯? 正规的开发模式是一个解决方案建几个项目啊?好像说有什么MVC三层,又有什么5层结构,又什么工厂结构的好复杂啊。。具体有什么区别啊?
threenewbee 2014-09-15
  • 打赏
  • 举报
回复
你的方法(3)才是多此一举,毫无意义,如果你同时用两个方法,IA c=new C();直接写C c=new C();就可以了。
threenewbee 2014-09-15
  • 打赏
  • 举报
回复
应用程序的所有组件的代码始终不应该显式引用另一个组件中的类(无论是在声明中还是在 new 语句中)。 相反,应使用接口声明变量和参数。 这是说,如果你想创建可复用的,低耦合的组件,这是一种设计原则,但是这绝对不是编写一般应用程序的原则。
u010573778 2014-09-15
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
用as 不会浪费空间 因为as只是让编译器识别这个类型,静态绑定上对应的方法调用而已,并不会在运行时增加任何代码。
引用 1 楼 caozhy 的回复:
用as 不会浪费空间 因为as只是让编译器识别这个类型,静态绑定上对应的方法调用而已,并不会在运行时增加任何代码。
一般设计良好的接口是不是不应该出现这种状况啊??? 还有一个问题嗷,就是technet说
“应用程序的所有组件的代码始终不应该显式引用另一个组件中的类(无论是在声明中还是在 
new
语句中)。 相反,应使用接口声明变量和参数。  ”
这个怎么理解啊?是不是说不能在一个类中实例化另一个类?哪方法的返回值如果是return new ...呢?难道说方法的返回值都定义成接口?那接口也太多了吧。。 接受参数的话也都是采用接口类型?那我如果想要访问那个变量的成员变量是不是都要定义成属性啊?
组件实例只应由组件的容器创建。 
这个是说只能在类内部实例化自己?别的类如果要这个类型的对象必须要调用这个类的方法获取返回的对象?就是工厂方法? 他还说
必须将应用程序设计为使不同的组件不相互依赖,而只依赖接口定义。
难道说我在每个类里面进行运算的时候方法的参数什么的也必须是接口? 好像说到现在言下之意就是每个类对应一个接口咯?这。。。
threenewbee 2014-09-15
  • 打赏
  • 举报
回复
用as 不会浪费空间 因为as只是让编译器识别这个类型,静态绑定上对应的方法调用而已,并不会在运行时增加任何代码。

110,539

社区成员

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

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

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