思考一: C#中接口和抽象类的使用上的区别:
---------------YYC
1、抽象类不能被实例化,但能拥有自己的成员字段和非抽象的方法,但接口比抽象类更加抽象,其成员只能是一般的方法、属性和索引函数而不能拥有自己的成员字段和构造函数。
2、用abstract声明的抽象类中的方法必须有访问修饰符如public等关键字进行修饰,其次抽象类里面的方
法须用abstract声明为抽象方法或则用virtual声明为虚拟方法(非抽象方法除外,虚拟方法有简单执
行代码,派生类中可以选择不重载,抽象方法没有任何执行代码,派生类中必须重载)。在其派生类
中重载抽象方法或虚拟方法时时必须用override修饰。而在用interface声明的接口类中的接口方法第
一不允许是静态的,其次除了无执行代码外
不能加任何访问限制修饰符,且不能用virtual或abstract进行修饰。同时在直接支持其接口的类型中不能用
override修饰符来表示重载方法,且必须支持即实现该接口中的所有方法。但可以用new关键字来隐藏父接口中的方法。
3、接口、抽象类、非抽象类都可以继承接口
4、继承接口后对其接口方法的实现:
实现可以分为“显示实现”和”隐式实现“
interface Interface1
{
int GetInt();
//派生类必须实现接口类里面的每一个方法
}
class cl1 :Interface1
{
public int GetInt() //隐式实现
{
return 1;
}
}
class cl2 : Interface1
{
public int GetInt()//隐式实现
{
return 2;
}
int Interface1.GetInt()//显示实现
{
return 4;
}
}
其中两者的区别是:隐式实现的方法既可以同接口对象调用,也可以通过派生类的实例来调用。
而对于显示实现的方法只可以通过接口对象来调用。而且显示实现时该方法前不能加任何的访问
修饰符,其实默认的为隐式的,所以派生类的对象不能调用该方法。
思考二:接口在C#中出现的意义。
一、解决了多态和动态隐藏不能统一的问题。
a、动态隐藏:在没有接口机制的动态隐藏是通过new关键字来隐藏基类的方法,从而
实现了基类对象和派生类对象通过使用相同方法名分别调用不同的方法;而在有接口的机制中是通过对于接口中的接
口方法的隐式实现和显示实现同时共存的方法来实现接口对象和派生类对象通过使用相同方法名分别调用不同的方法。
For example://接口的动态隐藏
cl2 c2 = new cl2();
Interface1 iter = c2;
MessageBox.Show(c2.GetInt());//输出2 ------会调用隐式方法
MessageBox.Show(iter.GetInt());//输出4 -------会调用显示方法
b、多态的实现:在没有接口的机制中,多态的实现是通过使用关键字abstract/virtual--override的重载来实现
的;而在接口机制中的多态直接通过显示实现多隐式实现都可以完成。
For example://接口的多态
cl1 c1 = new cl1();
cl2 c2 = new cl2();
Interface1 iter = c1;
MessageBox.Show(iter.GetInt());//输出1
Interface1 iter = c2;
MessageBox.Show(iter.GetInt());//输出4 --------会调用显示方法,如果没有显示实现则会调用隐式实现方法。
c:问题:关键问题就是在没有接口的机制中new机制和abstract/virtual--override不能同时出现,但是
在接口机制中通过同时显示实现和隐式实现方法共存,就可以很轻松的解决该问题了。在C#接口机制下的动态
隐藏和多态同时实现有至少三种模式:
For example:
/*模式一:*/
cl1 c1 = new cl1();
cl2 c2 = new cl2();
Interface1 iter = c1;
MessageBox.Show(iter.GetInt());//输出1
Interface1 iter = c2;
MessageBox.Show(iter.GetInt());//输出4 --------会调用显示方法,如果没有显示实现则会调用隐式实现方法。
MessageBox.Show(c2.GetInt());//输出2//输出2和4实现了1和4实现了多态,输出2和4实现动态隐藏
/*模式二:*/
从新写cl1类
class cl1 :Interface1
{
public virtual int GetInt()//隐式实现
{
return 1;
}
int Interface1.GetInt()//显示实现
{
return 3;
}
}
class cc : cl1
{
public override int GetInt()
{
return 5;
}
}
class cd : cl1
{
public override int GetInt()
{
return 6;
}
}
cl1 c1 = new cl1();
Interface1 iter = c1;
//动态隐藏
MessageBox.Show(iter.GetInt());//输出3 ---显示实现
MessageBox.Show(c1.GetInt());//输出1--------显示实现
cc cc1= new cc();
cd cd1 = new cd();
//多态
c1 = cc1;
MessageBox.Show(c1.GetInt());//输出5
c2= cd1;
MessageBox.Show(c1.GetInt());//输出6
所以运用接口就可以轻松地解决多态和动态隐藏的统一问题了。
二、实现多继承问题
实现多继承也是接口在C#中很独特和很重要的功能之一,
唉,这部分明天再另写一篇博客吧,以上内容只是个人理解还有不对的地方请读者帮忙指出,YYC再此感谢了。。。
待续。。。。。
下一部分的连接是http://blog.youkuaiyun.com/yyc1023/article/details/17281343