C#学习记录4——结构体,接口

 

1.结构体

对于C++语言来说,其实结构体和类几乎没有什么太大的区别。类能够实现的功能,使用结构体大部分也可以。

不过,在C#里面,我们把结构体看作是一种轻量的类的替代品。它和类一样有构造方法,属性,成员属性/数据,甚至是操作符。注意struct构造方法必须有传入参数。

当然struct也不是完全支持类的所有功能的。

首先,结构体无法进行继承。也就是说,结构体不想类那样灵活,代码也无法复用。

其次,也是非常重要的一点:结构体是一种值类型,而类是引用类型。这两种类型的区别,可以查看C#学习记录3上,里面关于类的第一点。

总的来说,一般只在定义一些内容小,较简单的类型时才会用到结构体。

结构体的声明十分的简单,这里就不举例了。

2.接口

C#和Java支持结构,而C++是不支持的。

如果你了解抽象类是个什么鬼,那么这个接口跟他差不多的东西。

接口优于抽象类的地方在于:当类继承了某个抽象类时,那么这个抽象类就作为基类存在。而接口则是将一种合同式的约定混入到已成立的继承树中。

这句话可以理解为,由于C#的单继承要求(即一个子类只能继承一个父类),而当希望“继承”多个不同的类时,就无法通过继承实现了。而类是可以实现多个接口的

1 abstract class Walk
2 {
3     abstract public void SomeMethod();   
4 }
1 interface IWalk //接口的命名一般以大写I开头
2 {
3     void SomeMethod();
4 }

上面两段代码,一个事抽象类,一个是接口。现在考虑如果我们有另一个类Run,现需要创造一个Person类同时继承Walk和Run(人既能跑又能跳)。

public class Person: Walk, Run
{
}

 这种方法就不能实现,因为一个类不能由多个父类

public class Person: IWalk, Run
{
}

只能这样实现。在继承树中,Run是Person的父类,而IWalk只是在Person上加入的协定,不影响继承树

 

既然介绍了允许继承多个接口,那么自然而然就产生了一个疑问:如果继承的两个接口中有同名的方法,那怎么办?

 1 interface IProgrammer
 2 {
 3     void Work();
 4 }
 5 interface IWriter
 6 {
 7     void Work();
 8 }
 9 public class Person1: IProgrammer, IWriter
10 {
11     void IProgrammer.Work()           //显示实现
12     {
13 
14     }
15     public virtual void Work()        //隐式实现
16     {
17 
18     }
19 }

如上例所示。作为程序员和作家,都有工作的方法,如果某个人在编程的同时还出版图书,那么他就同时实现了两份工作,而区分两份工作Work的最好方法是通过显示实现。
即用接口名.方法名的形式说明。不过,显示实现不能设置访问修饰字(即public,private等),他被默认为是公共的。另外显示实现的方法还不能使用abstract,virtual,override,new修饰字。并且对于Person1的某一个对象来说,直接通过对象来访问Work方法是会被理解成调用隐式实现的某个方法。将该对象强制转换成对应接口类型: Person1 p = new Person1(); IProgrammer pAsProg = p; pAsProg.Work();

 

上面说了强制将Person1的实例转换成IProgrammer。除了上面的方法,另外一种是使用as操作符。

IProgrammer pAsProg = p as IProgrammer;

as操作符有左右两个值。它将左值转换为右值所指明的类型,如果不能成功转换,则返回null。

 

posted on 2015-04-05 00:08  DennisWong  阅读(1087)  评论(0编辑  收藏  举报