现在有一个父类 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 类里面的属性; 又不希望丢失掉子类的属性值。该如何做?
1
liujunyuan 2020-08-13 10:28:19 +08:00
如果所有子类想要共享一个成员变量的话可以使用 static 成员变量.
但和你这个报错无关,不太懂 java 的 ref 类型,我理解 java 的 ref 和 c++的指针类似,这种 pDerived 转换成 pBase 的 upcasting 应该没问题吧,我也不理解,插眼等一个大神来解释 |
2
yesterdaysun 2020-08-13 10:43:32 +08:00 1
难道不是吧 ref 去掉就可以了? RequestBase 本来就是引用类型的对象
|
3
lawler 2020-08-13 10:47:00 +08:00
public <T> void SetClientInfo(<T extends RequestBase> t)
{ t.Version = "v3.0.0"; } |
4
BenWang OP |
5
wysnylc 2020-08-13 11:06:57 +08:00
@liujunyuan #1 java 没有 ref 他这是 c#吧
|
6
kiracyan 2020-08-13 14:26:36 +08:00
第一次见空方法用 ref 的 直接 return 不香吗
|
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#,值类型和引用类型的基本区别还没搞清楚。 |
8
foxasan 2020-08-13 17:45:01 +08:00
为什么不提成接口呢???
|
9
Goooler 2020-08-13 19:04:57 +08:00
方法名也能大写开头吗
|