这短时间,从入手C#,到完成之前的几个WPF的项目,一直忙着完善各种需求上的事,趁这几天老板出差,整理下思路,话不多说,进入正题。
.Net的OOP模式下类型转换理论上为一下8种:
- 父 = new 父
- 子 = new 子
- 父 = new 子
- 子 = new 父
- 父 = (父)子
- 父 = (子)父
- 子 = (父)子
- 子 = (子)父
前四种是隐式转换,后四种是显示转换,比如其中1,2,3,5,8应该是我们常用到的方式,那么另外几种呢,其实仍然是可以使用的,在.net默认环境下,4就没法实现,但是我们可通过实现转换运算符重载来实现,代码如下:
class parent
{
public int age;
}
class son:parent
{
public int age;
/*重载隐时转换的方式*/
public static implicit operator son(parent p)
{
son s = new son();
s.age = p.age;
return s;
}
}
class Program
{
static void Main(string[] args)
{
son s = new parent();
}
}
通过重载隐式转换符,可以看到,子 = new 父这种方式在隐式传入时,重新实例化了一个新的子类实例,然后通过浅度复制或者深度复制再返回这个子类实例,实际上到这里,仍然是返回了与子类引用对应的子类实例,但是这里在内存里面实际上存在一个引用,2个实例,这是子 = new 父,而子 = new 子这种形式就对应一个引用,一个实例。
之前一直以为上面8种方式有几种不成立,只是平时1,2,3,5,8这些是常用方式而已。