举例:接口的定义,实现,为什么要用接口,意义何在?
发布网友
发布时间:2022-04-20 07:45
我来回答
共3个回答
热心网友
时间:2023-06-28 02:34
你要把接口也理解成一种类,比如有个基类叫baseClass,一个继承他的类叫subClass,那么subClass也算是baseClass类型的,可以有这样的写法baseClass bc=new subClass()
接口也是一样,如果一个类MyClass实现了借口一个接口interfaceClass,你事实上可以把MyClass叫做interfaceClass的子类,可以有这样的写法interfaceClass ic=new MyClass()
这就是所说的多态的一部分基础。可以举个实在点的例子,比如你想写一个方法叫EnumAll,参数是一个类的实例,作用是例举出该实例中的每个子元素并打印出元素的ToString(如窗体的子元素是窗体中的控件,数组的子元素就不用说了吧),你就遇到两个问题
首先EnumAll参数的类型是什么。参数应该可以是一个Form类型,因为窗口中有很多控件,使用EnumAll和一个Form的实例做参数可以打印出包含在该参数窗体中的每个控件的名字;但是一个数组Object[]类型应该也可以使用EnumAll方法,EnumAll可以列举Object[]中的每个元素并打印。你是要把方法写成void EnumAll(Form e)还是写成void EnumAll(Object[] e)?
然后就是EnumAll怎样实现才能得到不同类型的实例的子元素?如果是void EnumAll(Form e)的形式,要想得到子元素要用
foreach(Control c in e.Controls)
{
Console.WriteLine(c.ToString());
}
的写法,如果数组要用
for(int i=0;i<e.length;++i)
{
Console.WriteLine(e[i].ToString());
}
的实现方法。
Form和Object[]是两种完全不沾边的类型,那么EnumAll到底该怎么写?
这时就可以使用接口,可以定义一个接口
interface IEnumable
{
Object next();//返回下一个子元素的方法
}
然后使Form和Object[]类型都实现IEnumable接口(实现方法是不同的,如前面所说),然后这样写EnumAll方法:
void EnumAll(IEnumable e)//一开始就说了,实现接口的类都可以算是接口的子类
{Object o;
while((o=e.next)!=null)
{
Console.WriteLine(o.ToString());
}
}
于是解决了上面的问题。
不知道有没有说清楚,如果理解了上面举的例子算是初步了解接口了,接口的多继承和多态性还有很多内容。
另外,上面的东西只是举例子,虽然C#中确实有IEnumable接口,但其定义要复杂的多,我只是举个简化的自己编的例子^_^。C#的(应该说是FCL吧)很多类都实现了IEnumalbe接口,像集合类和数组等。
热心网友
时间:2023-06-28 02:34
接口相当于一种约束,它里面只包含了属性、方法的定义,而没有具体实现,这点类似一个抽象类,但是与抽象类不同的时它不能包含有已经实现的方法。比如:
public interface IInterfaceExample
{
int Property1 {get;set;}
string Test();
}
里面的成员不用写修饰符,是因为所有里面的都是可以对外公开的内容,都是 public 的。
它的本意是为多个不同的对象规定一个通用的规范,最常见的莫过于用来实现多态了。
通过这个接口,调用者无须知道目标对象的具体详细信息,只需要知道它实现了这个接口,那么它便可以依据这个接口来使用这个对象了。
热心网友
时间:2023-06-28 02:34
接口就相当于万能驱动,大部分驱动程序他都能驾驭,也就是我把接口给出来,SUN公司的程序可以调用,其他公司的也可以,就是为了方便二次开发或做项目接口用的,相当于给出了一个平台,什么东西都可以放上去,如果没有这个平台,东西就放不到上面去了