科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道今天被out参数玩了一把

今天被out参数玩了一把

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

out要求传入的参数类型和声明的类型是一致的。原来的是out搞的鬼!对out参数子类到基类的转换是用不成的, 可是如果new的是基类,那么使用基类不就没意义了吗?

作者:你就是我心中的女神 来源:CSDN 2008年3月14日

关键字: 参数 out java

  • 评论
  • 分享微博
  • 分享邮件

我们经常写这样的代码:

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参数还有这问题呢?照着平常的思路老是走不通,还道是继承的有问题呢,还好,总算把原因搞清楚了
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章