当一个子类继承了父类后,他就会拥有父类的属性和方法了,同时我们还可以加一些子类特有的属性和方法。
父类:
class parent
{
public string aa = "";
public void f1()
{
aa = "parent";
Console.WriteLine("aa="+aa);
}
}
子类:
class child1 : parent { public string bb; //子类中新加的 public void f1() { this.aa = "child1"; Console.WriteLine("aa="+aa); } public void f2() //子类中新加的 { this.bb = "child1"; Console.WriteLine("bb=" + bb); } }
如果将声明一个父类p并将一个child1的对象赋给它
parent p = new child1();
那么在child1对象中的那些多余的属性和方法去哪里了呢?是不是就丢失了呢?
通过测试发现
p.f1(); //aa=parent ((child1)p).f2(); // bb=child1 ((child1)p).f1(); // aa=child1
在p中的child1里的属性和方法并没有丢失,只是如果我们不讲他转换为child1类型的话就无法使用f2这个方法。
假设parent占用的内存空间是1M的,而child1的大小事1.5M,将child1赋给parent后,parent仍然会是1.5M,但是多出来的那0.5M我们无法访问。
同样的在接口的实现的过程中也会有相同的问题
public interface Interface1 { void f1(); void f2(); }
class Class1 : Interface1 { public void f1() { Console.WriteLine("Class1.f1 is running..."); } public void f2() { Console.WriteLine("Class1.f2 is running..."); } public void f3() { Console.WriteLine("Class1.f3 is running..."); } }
同样的这样声明一个变量c1
Interface1 class1 = new Class1();
class1.f1(); //Class1.f1 is running...
((Class1)class1).f3(); //Class1.f3 is running...
唯一的区别就是在于接口中的方法只是声明没有被实现,所以当运行这个class1.f1()时,会直接找到他的子类的中的方法(它会根据赋给他的对象类型判断是使用的是哪个子类中实现的方法)。这个东西在做简单工厂类的时候经常用到,从工厂中出来的对象他的类型可能有很多,不过他们都是对同一个接口的实现,所以可以直接将出来的对象赋给这个接口,这样减少很多麻烦,对于那些接口中有的方法直接调用就可以了,而那些新增的方法就只能强制转化后在使用了。