首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于接口,小弟我一直没明白,谁点拨下

2011-12-21 
关于接口,我一直没明白,谁点拨下publicinterfaceIMyInterace{voidDoSomething()}classProgram:IMyInterac

关于接口,我一直没明白,谁点拨下
public   interface   IMyInterace
        {
                void   DoSomething();
        }
        class   Program:IMyInterace
        {
                public   void   DoSomething()
                {
                        Console.WriteLine( "111 ");
                }
                static   void   Main(string[]   args)
                {
                        Program   t1   =   new   Program();
                        t1.DoSomething();
                }
        }


接口是那么用的吗?如果是的话,与以下代码有何区别:

        class   Program
        {
                public   void   DoSomething()
                {
                        Console.WriteLine( "111 ");
                }
                static   void   Main(string[]   args)
                {
                        Program   t1   =   new   Program();
                        t1.DoSomething();
                }
        }

[解决办法]
接口嘛,举个例子,你要用u盘时,难道自己在电脑做一个usb接口,当然时用上面自带的嘛
[解决办法]
转贴

1. Interface, "like a "关系; abstract class, "is a "关系

2. Interface是一种契约, abstract class是事物本质的抽象概括

由以上两点, 什么时候用Interface什么时候用abstract class有看你如何理解你的设计对象, 例如, 某一天你可能会要设计一个Door的类, 它有Open和Close两个功能, 于是

public interface Door
{
void Open();
void Close();
}

public abstract class Door
{
void Open(){};
void Close(){};
}

就目前来说, 你用Interface还是用abstract class基本上没什么区别, 两者都用来描述Door的行为, 只不过用Interface是在强调Door额外的有Open和Close这两个功能, 而用abstract class则是在强调Door自带有Open和Close的能力

走远一点, 假如又有一天, 你要写一个AlarmDoor的类, 这个时候...

public interface AlarmDoor
{
void open();
void close();
void alarm();
}

public abstract class AlarmDoor
{
void open(){};
void close(){};
void alarm(){};
}

现在, 你应该想清楚你究竟是想设计一个报警器还是想设计一扇门, 如果选择Interface, 那你是在想设计一个报警器, 如果选择abstract class, 那你是在想设计一扇门, 说到现在, 是否有点眉目了?

C#里面不允许多个父类, 但却允许多个接口, 接口无非是让某个类拥有某种行为, 而抽象类却是在让某个类拥有某种本质, 因此, 我们设计的类, 应该用一个抽象类把它的所有本质都抽象出来, 而它的一些行为(或者说是契约)则通过Interface来实现, 这也能说明为什么C#会不允许多层父类却允许多层接口

[解决办法]
你上面的代码是没有区别的!


最上面的应该改成
static void Main(string[] args)
{
IMyInterace t1 = new Program();
t1.DoSomething();
}




[解决办法]
以你的代码解释补了接口的妙处
[解决办法]
首先,你的题目中两个例子是没有区别的;

1 如果你不需要继承的话,永远都是单个类就可解决问题的话,你可以不需要使用接口.
2 为何需要接口? 接口定义了一种规范,这让你的整个程序框架可读性增强.比如说吧,让你写一个汽车的类和自行车的类,如果你不继承,你该如何写? 用接口的话,可以定义它们共同的属性(外观颜色),方法(Run),不同的部分可以在继承类中扩展实现.简而言之,是OOP的思想;
3 C#不支持多继承,但是可以继承自多个接口

其他,等楼下继续.
[解决办法]
用接口使程序更清晰
1.接口是为需编写的类提供一个蓝图。
2.接口只提供定义。
接口类似抽象方法,且为public
[解决办法]
接口方便后续添加,更新软件,还有很多

你可以自己特地去看一下接口的用处
这里说不了那么多
[解决办法]
只要理解成接口是对某些功能的提供就行。
IMyInterace t1 就是说t1提供IMyInterace接口所定义的功能。
至于t1 = new Program();就是说这个接口是由Program类来实现的。

比如一个函数定义
public void DoSomeFunction(IMyInterace t1)
{
t1.func1();
t1.func2();
...
}
这个函数不需要知道具体是哪个类实现了接口定义的内容。
[解决办法]
public interface IMyInterace
{
void DoSomething();
}
class Program1:IMyInterace
{
public void DoSomething()
{
Console.WriteLine( "111 ");
}
}
class Program2:IMyInterace
{
public void DoSomething()
{
Console.WriteLine( "222 ");
}
}
class Program3:IMyInterace
{
public void DoSomething()
{
Console.WriteLine( "333 ");
}
}

class Program
{
static void Main(string[] args)
{
List <IMyInterace> list=new List <IMyInterace> ();
list.Add(new Program1());
list.Add(new Program2());
list.Add(new Program3());
foreach(IMyInterace i in list)
{
i.DoSomething();
}

}
}

你也可以用abstract class代替Interface,不过这两者是有区别,但与此问题无关,就不说了.
这种问题看书就能知道了.何必上来问? 多看下与设计模式相关的书吧.
[解决办法]
比如
Print(IEnumable i)
{
foreach(object o in i)
Console.WriteLine(o);
}

那任何实现了IEnumable接口的类型都可以通过Print输出,ArrayList,数组等等,虽然他们具体实现不同。
[解决办法]
楼主好贴!
如果你只有一个类在程序的同一个位置DoSomething()的话,你后面一种写法就OK了,用不着Interface.
但是,如果你的t1.DoSomething();可能会被两个(或者多个)不同的类调用,而且可能会在运行时才知道调用哪个类的DoSomething(),用Interface就比较好了。
像GalfordLiu(喜欢汪峰的歌)写的代码就很能说明这个问题。

[解决办法]
你的代码,如果不处在任何上下文中,两种没有区别!所以就你的代码,没有太多需要说明的。
什么是接口?
(1)接口对于实现者(实现类)来说是定义了一种规范,比如,如果你是Windows开发人员,为了能够查询每一个硬件的描述信息,你希望所有的硬件厂商在其驱动中实现IDescribable接口(由你提供),这个接口定义了Description属性,那么当硬件厂商实现了这个接口时,你就很容易去取得每一个硬件设备的描述信息。
(2)在C#中,不支持多重继承,因此对于C#来说,接口是协助实现多重继承的工具。
(3)抽象上说,接口就是定义了某个对象的在某个特定方面的外在表现,通过实现多个接口,同一个对象对于不同的使用者反应出多个不同的面和交互方式。
(4)为了实现版本的要求,接口应该具有不变性,也就是说,接口的定义者,在实现者发布他们的对象后,不能随意修改接口定义,否则接口就会失去其意义,这就是为什么,你会经常看到IAbc,IAbc2:IAbc,...。
[解决办法]
up
[解决办法]


up
[解决办法]
amandag(高歌) ( ) 信誉:98 2007-7-15 10:00:20 得分: 0

他发的很好,你要多读读,已经很深刻的解释了接口。
[解决办法]
首先回答LZ的问题:
接口是那么用的吗? 可以肯定的告诉用法是正确的。
区别是什么? 如果就LZ的程序实现功能来说,他是没有区别的
如果真是进行区别,也就是楼上高歌所说的抽象类
(abstract class)和接口(interface)之间的区别。应该说最大的区别就是在C#中,不支持多重继承,因此对于C#来说,接口是协助实现多重继承的工具。

[解决办法]
http://blog.csdn.net/moremoreTea1983/archive/2007/07/16/1693813.aspx
让你明白什么是接口
[解决办法]
学习
[解决办法]
其实接口有好多好处,比如说变相实现多重继承。
从你写的这段代码来说,使用接口是没有任何意义的。
[解决办法]
studyed

热点排行