个人体会: Interface的一个用处是实现多态: OO的三个核心是encapsulation, inheritance and polymorphism. 它们之间有一定的先后关系, 当我们在用C++时, 它支持多根继承, 所以 // VCDemo001.cpp : Defines the entry point for the console application. //#include "stdafx.h"class A { public : virtual void function1(){}; };class B { public: virtual void function2(){}; };class C: public A, B { public: void function1() { printf("Function1\n"); }; void function2() { printf("Function2\n"); }; };int _tmain(int argc, _TCHAR* argv[]) { C* c; c = new C(); A* a; a = (A*)c; c ->function1(); a ->function1(); B* b; b = (B*)c; c ->function2(); b ->function2(); getchar(); return 0; }在c#中采用了与Java一样的方案, 只许单根继承, 因为多根继承会有一些缺点, 如名字冲突. 所以, 采用Interface来使用多态的好处. 既设计者只须定义好接口, 只要class是inheritance从这个Interface, 就可将它upcast到Interface, 然后使用Interface中定义的method.using System;namespace ConsoleApplication1 { interface IA { void function1(); } interface IB { void function2(); } class C: IA, IB { public void function1() { Console.WriteLine("Function1"); } public void function2() { Console.WriteLine("Function2"); } } /// <summary> /// Summary description for Class1. /// </summary> class Class1 { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { C c; c = new C(); IA a; a = (IA)c; c.function1(); a.function1();
IB b; b = (IB)c; c.function2(); b.function2();
Console.ReadLine(); } } }
很多时候在考虑设计而不是考虑编码的时候,接口才真正清晰,明朗的把它的原理展现给你。如果你看过设计模式这本书,你一定会对软件有一个重新的认识。四人组道出了一个面向对象界的真理:面向接口设计和编程。举个简单的例子,计算机的主板和显卡,他们之间有统一的约定,只要符合PCI扩展的标准,那么你的显卡肯定能插上主板,并能访问主板来的信息。这个约定就是接口。很多时候,在软件开发领域,接口设计应该是系统分析者的事情,也就是Team Leader的是事情了。Team Leader根据需求设计出Schelable的接口和Architecture,程序员根据他的Architecture去编码,最后开发,测试等等。其实,很多时候,你不用接口也能实现相同甚至更完备的功能。但是,有了接口,会使整个设计变得清晰,明朗。如果从软件的扩展性和重用性上看,接口的设计更显的举足轻重。所以说,理解和认识接口应该从设计的角度看,而不是编码的角度。 附:A Sample需求:在一个表格(已有的Table类)里面我要显示这样一些数据:1 文本信息: 显示文本2 图片信息:显示图片3 视频信息:播放视频设计如下: interface IDisplayable { void Display(Table table); }public class Text:IDisplayable { .... ..... public void Display(Table table) { //implements the text display method } }public class Picture:IDisplayable { ...... public void Disply(Table table) { //implements picture display here } }public class Vedio:IDisplayable { ...... public void Disply(Table table) { //implements vedio play } }public class Test { Text t = new Text("Hello"); Picture p = new Picture("1.jpg"); Vedio v = new Vedio("sample.avi");
Table table = new Table(); Table.Add(t); Table.Add(p); Table.Add(v); Table.Show(); foreach(IDisplayable disp in Table.Items) { disp.Display(this.table); }
}
Class 只能单继承 ,Interface可以实现多继承 Interface中只能定义属性和方法,但不其实实现要在继承自她的Class实现不能 创建 Interface实例进行直接调用
接口的提供是为了更好的实现类的安全和扩展,
通过让类来实现接口,可以将类内的方法私有化而又使外界可以访问,
这是从安全的角度来考虑的,例如:
msdn的例子接口可以使用多重继承。在下面的示例中interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
interface IListBox: IControl
{
void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}
接口 IComboBox 同时从 ITextBox 和 IListBox 继承。类和结构可以实现多个接口。在下面的示例中interface IDataBound
{
void Bind(Binder b);
}
public class EditBox: Control, IControl, IDataBound
{
public void Paint() {...}
public void Bind(Binder b) {...}
}
类 EditBox 从类 Control 派生,并且同时实现 IControl 和 IDataBound。在前面的示例中,IControl 接口中的 Paint 方法和 IDataBound 接口中的 Bind 方法是使用 EditBox 类的公共成员实现的。***注意***C# 提供了实现这些方法的另一种方式,允许实现类避免使这些成员成为公共的。接口成员可以用限定名来实现。例如,可以改为通过提供 IControl.Paint 和 IDataBound.Bind 方法来实现 EditBox 类。 public class EditBox: IControl, IDataBound
{
void IControl.Paint() {...}
void IDataBound.Bind(Binder b) {...}
}
用这种方式实现的接口成员称为显式接口成员,这是因为每个成员都显式指定实现的接口成员。*****只能通过接口调用显式接口成员*****。例如,只能通过强制转换为 IControl 接口的方式调用 EditBox 的 Paint 方法实现。看到了吧,方法被定义为私有的,外界不可以直接访问方法,只能通过借口类型去访问,如果没有接口,私有方法怎么被外界访问呢???
扩展方面:只要接口不变,接口的实现发生变化,调用类的客户程序照样可以运行,
因为接口使得具体的实现变的透明。你可能会问,如果用来提供重载方法和虚方法(重写)来实现不也行吗,
我觉得这还是不太一样,重载只是提供了方法自身的扩展,并且这种扩展
是极其狭窄的;而重写则仅能通过继承,在派生类中实现,接口则不同了,
它使得类的方法的拓展在类自身可以自由实现以上是我的体验,不知道说得对不对,非常希望听听别人的看法。
请指教。
我看过纪俊的********** www.vbuser.net/csource ******************
很是不错,比那些公司站点做的还要好,
我结识了这个年轻的小伙子,如果你看了他的站点,请不要挑剔
因为这是出自一个大一的学生的手。 我前一段时间经常看到vb版出现这样的贴子,叹息vb程序员的末路,
而纪俊从qb起家,写得最多的是asp,面对.net的冲击,最受影响的应该是
asp,因为asp.net给web页面开发者带来了质变的飞跃,不论从开发还是调试
不论是vb.net还是C#,作为 asp.net开发的语言载体,对原来的asp开发人员来
说都是挑战。
现在,我们这群vb版的程序员应该无话可说,因为,去看看我们这位年轻
朋友做的----------------------www.vbuser.net/csource,我与这位兄弟
交流之后,深深的感到了他的可爱,他的谦虚,他的热情,
水平很高,但是丝毫不狂妄,热爱自己所做的一切并且为之不求回报,
我们vb版的许多老大们,放下你们的狂妄,去看看我们的小兄弟自己在做的事情,
去体验一下与csdn截然不同的朴实,原始,去那里探寻vb程序员的未来
生存之路。 我们其实应该清楚,每隔一段时间,当新技术出现的时候,应该把自己放在和晚辈相同的起点上,这样我们大家才会共同进步。 风格与csdn相似,也是积分制,现在去的话还可以混老大,就像我;
不过我水平有限,另外由于时间的原因,只是代理斑竹,现诚征斑竹,
请快快去*********** www.vbuser.net/csource ***************注册
希望大家在一起,能够互相促进,新老朋友共同进步!!!
(在此向纪俊兄弟表示全力支持,并尽可能提供我所有的一切技术资料,
小站正在建设中,让我们和vs.net走在一起)
请快快去*********** www.vbuser.net/csource ***************注册
有点驴唇不对马嘴,因为,我也是从vb搬过来的
Interface的一个用处是实现多态:
OO的三个核心是encapsulation, inheritance and polymorphism.
它们之间有一定的先后关系, 当我们在用C++时, 它支持多根继承, 所以
// VCDemo001.cpp : Defines the entry point for the console application.
//#include "stdafx.h"class A
{
public :
virtual void function1(){};
};class B
{
public:
virtual void function2(){};
};class C: public A, B
{
public:
void function1()
{
printf("Function1\n");
};
void function2()
{
printf("Function2\n");
};
};int _tmain(int argc, _TCHAR* argv[])
{
C* c;
c = new C();
A* a;
a = (A*)c;
c ->function1();
a ->function1(); B* b;
b = (B*)c;
c ->function2();
b ->function2();
getchar();
return 0;
}在c#中采用了与Java一样的方案, 只许单根继承, 因为多根继承会有一些缺点, 如名字冲突.
所以, 采用Interface来使用多态的好处. 既设计者只须定义好接口, 只要class是inheritance从这个Interface, 就可将它upcast到Interface, 然后使用Interface中定义的method.using System;namespace ConsoleApplication1
{
interface IA
{
void function1();
} interface IB
{
void function2();
} class C: IA, IB
{
public void function1()
{
Console.WriteLine("Function1");
} public void function2()
{
Console.WriteLine("Function2");
}
} /// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
C c;
c = new C(); IA a;
a = (IA)c;
c.function1();
a.function1();
IB b;
b = (IB)c;
c.function2();
b.function2();
Console.ReadLine(); }
}
}
附:A Sample需求:在一个表格(已有的Table类)里面我要显示这样一些数据:1 文本信息: 显示文本2 图片信息:显示图片3 视频信息:播放视频设计如下:
interface IDisplayable
{
void Display(Table table);
}public class Text:IDisplayable
{
....
.....
public void Display(Table table)
{
//implements the text display method
}
}public class Picture:IDisplayable
{
......
public void Disply(Table table)
{
//implements picture display here
}
}public class Vedio:IDisplayable
{
......
public void Disply(Table table)
{
//implements vedio play
}
}public class Test
{
Text t = new Text("Hello");
Picture p = new Picture("1.jpg");
Vedio v = new Vedio("sample.avi");
Table table = new Table();
Table.Add(t);
Table.Add(p);
Table.Add(v);
Table.Show(); foreach(IDisplayable disp in Table.Items)
{
disp.Display(this.table);
}
}
……
我看c#和java一样
另外
class C:IA, IB
{...}
不算是多继承吗?
和扩展性如何呢?我不说,想必大家都明白。
本人最近闲来无事,设计了一个BBS,感觉.net平台给设计者带来更多的便利和底气。BBS的系统架构大致如下:User Interface<-->BBS WebServices<--->Business Logic<--->Data Access<----->DB Server这大三层小五层结构,相对来说,扩展性和重用性还是可以的。UI层和逻辑层用XML进行数据交互,然后对XML,根据不同的系统去分析。整体架构上套用了Facade Patterns(外观模式---结构型)和Iterate模式。
这样完全可以编写一个论坛引擎出来,可惜现在我还是初学,还有很多都不太了解。