zoukankan      html  css  js  c++  java
  • 今天被out参数玩了一把

    我们经常写这样的代码:

    public class Class2
        {
            
    private void InvokeTest()
            {
                Derive d 
    = new Derive();
                Test(d);
            }
            
    private void Test(Base b)
            {
            }
        }
        
    class Base
        {
        }
        
    class Derive : Base
        {
        }
        
    class Derive1 : Base
        {
        }

    使用基类来表示一个界面,然后传递子类。但是把这段代码改一改:

    public class Class2
        {
            
    private void InvokeTest()
            {
                Derive d 
    = new Derive();
                Test( 
    out d);
            }
            
    private void Test( out Base b)
            {
                b = ......
            }
        }
        
    class Base
        {
        }
        
    class Derive : Base
        {
        }
        
    class Derive1 : Base
        {
        }
    按照平常的思路是没问题的,可是连编译都通不过。Why? 是继承体系不对?查一查,没问题。参数类型不对?也没问题,如果把Derive d = new Derive()换成Base d = new Base(),编译是没问题的。或者不使用out,编译也没问题。
    费了老大劲,才找到关于这个问题的说明:
    out要求传入的参数类型和声明的类型是一致的。原来的是out搞的鬼!对out参数子类到基类的转换是用不成的,
    可是如果new的是基类,那么使用基类不就没意义了吗?
    没办法,框架是人家写的,人家用了out参数我们也不能怎么样,不过这个问题得搞清楚。要传子类,还得自己想办法,绕个道:
        class Class1
        {
            [STAThread]
            
    static void Main(string[] args)
            {
                BaseClass y ;
                Test( 
    out y ,typeof(DeriveClass2) );
                y.WriteName();
                Console.ReadLine();
            }
            
    static void Test(  out BaseClass y ,Type t )
            {
                y 
    = BaseClass.CreateInstance(t);
            }
        }
        
    class BaseClass
        {
            
    public static BaseClass CreateInstance(Type deriveClassType)
            {
                
    return (BaseClass)System.Activator.CreateInstance(deriveClassType);
            }
            
    public void WriteName()
            {
                Console.WriteLine(
    this.ToString());
            }
        }
        
    class DeriveClass : BaseClass
        {
        }
        
    class DeriveClass2 : BaseClass
        {
        }
    要不是这次碰到这样的问题,我还真不知道out参数还有这问题呢?照着平常的思路老是走不通,还道是继承的有问题呢,还好,总算把原因搞清楚了
  • 相关阅读:
    BZOJ 4511 洛谷3131 USACO 16.Jan 七子共
    Atcoder Code Festival 2017 qual C 10.22 D题题解
    hdu 5122(2014ACM/ICPC亚洲区北京站) K题 K.Bro Sorting
    HDU 5115 (2014ACM/ICPC亚洲区北京站) D题(Dire Wolf)
    POJ
    hihocoder 1032 最长回文子串(Manacher)
    hihocoder 1015 KMP算法
    Trie树 hihocoder 1014
    POJ 3468 线段树区间修改查询(Java,c++实现)
    atCoder Ants on a Circle(又是蚂蚁问题。。。)
  • 原文地址:https://www.cnblogs.com/dahuzizyd/p/302807.html
Copyright © 2011-2022 走看看