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。