1.C#中类不支持多继承,原因是多继承会造成许多的歧义,比如假如你有一个类叫老虎,还有一个类叫苍蝇。现在你想新创一个超级老虎类,一种可以飞的老虎。在C++中,你可以定义一种超级老虎类,让其继承自老虎和苍蝇,这样这种老虎就可以飞了。然而,问题出现了,这种超级老虎由于同时也继承自苍蝇,而苍蝇下面有个方法叫吃,参数类型是屎。吃屎的这个方法显然跟我们的超级老虎太不搭了。
但是,在C#中可以使用接口,接口是在继承的类中进行方法的定义的:
1.接口成员访问权限为public,但不能加访问修饰符
2.接口成员不能有定义
3.接口成员必须是方法,属性,索引器或事件,不能包含常数,字段,运算符,实例构造函数析构函数等。
(接口不是类,不能用接口创建对象,但是可以声明接口类型的引用指向实现了该接口的对象),例如:
public interface fly{}
public class tiger : fly{}
fly a = new tiger();//如此实例化
C#中的扩展方法
扩展方法从字面上理解是指扩展的方法,而对应到面向对象编程这个格局中则是指为一个类提供的扩展方法。按照我们通常的理解,我们首先需要获得某个类的源代码,然后在这个类代码中增加成员方法,这样就可以达到为一个类提供扩展方法的目的。可是不幸地是,这种方法在没有源代码的情况下就无法奏效了,而且还需要更改实现接口的所有的子类。因为接口中的成员函数必须被子类实现。
扩展方法在实现上和普通的面向对象编程是一样的,换句话说,我们只需要定义一个类,然后在里面添加并实现相应的方法即可。但是这里需要注意的地方有三点,
第一:实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关;
第二:实现扩展方法的类方法必须是静态方法;
第三:实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类。
例如,我们知道将一个合法字符串类型转换为整型,可以使用int.parse()方法,假如我们希望为string类型扩展一个ToInt方法应该怎么办呢?我们一起来看下面的这段代码:
/// 1、定义一个静态类
/// 2、静态类的名称和要实现扩展方法的具体类无关
public static class SomeClass
{
/// 3、实现一个具体的静态方法,第一个参数必须使用this关键字指定要使用扩展方法
public static int ToInt(this string str)
{
return int.Parse(str);
}
}
//实现时
string str = "1234";
int val = str.ToInt();
这个示例向大家展示了如何编写一个无参数的扩展方法,那么当我们需要在扩展方法中传入参数的时候该怎么做呢?我们只需要在第一个参数后继续加入参数的声明就好了。例如我们在Unity3D中常常需要给一个3D物体设置坐标,通常我们可以通过下面的代码来实现:
transform.position = new Vector3(1,1,1);
public static void SetPositionX(this Transform tran, float x)
{
tran.position = new Vector3(x, tran.position.y, tran.position.z);
}
public static void SetPositionY(this Transform tran, float y)
{
tran.position = new Vector3(tran.position.x, y, tran.position.z);
}
public static void SetPositionZ(this Transform tran, float z)
{
tran.position = new Vector3(tran.position.x, tran.position.y, z);
}
//使用时
transform.SetPositionX(1.0f);
transform.SetPositionY(1.0f);
transform.SetPositionZ(1.0f);