V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BenWang
V2EX  ›  程序员

[编程问题] 如何给 所有子类的 同个父类属性 赋值。

  •  
  •   BenWang · 2020-08-13 10:12:13 +08:00 · 2465 次点击
    这是一个创建于 1545 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个父类 RequestBase,所有的子类都继承自它。

     public abstract class RequestBase
     {
            public long Version { get; set; }
     }
    
    
     public class LoginRequest : RequestBase
     {
            public string UserName { get; set; }
     }
    

    现在我想有一个方法,可以给所有的 类赋值属性 Uid,我尝试这样做,但是会提示 cannot convert from 'ref LoginRequest' to 'ref RequestBase'

     public void Todo() {
           LoginRequest _req = new LoginRequest();
           _req.UserName = "zhangsan";
           SetClientInfo(ref _req);
     }
    
      public void SetClientInfo(ref RequestBase _reqBase)
      {
                _reqBase.Version = "v3.0.0";
      }
    

    如果强转换,会丢失掉 LoginRequest 类里面的属性; 又不希望丢失掉子类的属性值。该如何做?

    9 条回复    2020-08-13 19:04:57 +08:00
    liujunyuan
        1
    liujunyuan  
       2020-08-13 10:28:19 +08:00
    如果所有子类想要共享一个成员变量的话可以使用 static 成员变量.
    但和你这个报错无关,不太懂 java 的 ref 类型,我理解 java 的 ref 和 c++的指针类似,这种 pDerived 转换成 pBase 的 upcasting 应该没问题吧,我也不理解,插眼等一个大神来解释
    yesterdaysun
        2
    yesterdaysun  
       2020-08-13 10:43:32 +08:00   ❤️ 1
    难道不是吧 ref 去掉就可以了? RequestBase 本来就是引用类型的对象
    lawler
        3
    lawler  
       2020-08-13 10:47:00 +08:00
    public <T> void SetClientInfo(<T extends RequestBase> t)
    {
    t.Version = "v3.0.0";
    }
    BenWang
        4
    BenWang  
    OP
       2020-08-13 10:59:07 +08:00
    我试了一下,好像是我想多了。根本不需要 ref 就可以

    ![汗颜啊。。。。]( )
    wysnylc
        5
    wysnylc  
       2020-08-13 11:06:57 +08:00
    @liujunyuan #1 java 没有 ref 他这是 c#吧
    kiracyan
        6
    kiracyan  
       2020-08-13 14:26:36 +08:00
    第一次见空方法用 ref 的 直接 return 不香吗
    geelaw
        7
    geelaw  
       2020-08-13 14:30:16 +08:00   ❤️ 1
    因为 ref RefType argName 的含义是 argName 对应一个静态类型是 RefType 的变量,且方法内对 argName 的赋值可以反映到传入 argName 的变量。显然你不能把静态类型是 Derived 的变量传入 ref Base,否则方法体内可以对 argName 赋值 new AnotherDerived,然后类型安全就会爆炸。

    楼主需要认真学习 C#,值类型和引用类型的基本区别还没搞清楚。
    foxasan
        8
    foxasan  
       2020-08-13 17:45:01 +08:00
    为什么不提成接口呢???
    Goooler
        9
    Goooler  
       2020-08-13 19:04:57 +08:00
    方法名也能大写开头吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2974 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:40 · PVG 22:40 · LAX 06:40 · JFK 09:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.