将子类赋给父类

当一个子类继承了父类后,他就会拥有父类的属性和方法了,同时我们还可以加一些子类特有的属性和方法。

父类:

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()时,会直接找到他的子类的中的方法(它会根据赋给他的对象类型判断是使用的是哪个子类中实现的方法)。这个东西在做简单工厂类的时候经常用到,从工厂中出来的对象他的类型可能有很多,不过他们都是对同一个接口的实现,所以可以直接将出来的对象赋给这个接口,这样减少很多麻烦,对于那些接口中有的方法直接调用就可以了,而那些新增的方法就只能强制转化后在使用了。

 

 

转载于:https://www.cnblogs.com/hfliu/archive/2013/04/11/3014777.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值