【问题标题】:Inherited class as reference继承类作为参考
【发布时间】:2014-03-27 19:46:48
【问题描述】:

我想使用一个具有 A 类型参数的函数。我想将一个派生自 A 的 B 类传递给它。但 C# 不想这样做。

class A
{
 int m_a;
}

class B : A
{
 int m_b;
}

void ShowandEditData( ref A _myvar)
{
 ...
}

现在,我想做这样的事情:

B myB = new B();

ShowandEditData(ref myB);

我已经尝试了很多方法,例如强制转换或使用 base 属性。我想我做错了。

用 C# 可以做到这一点吗?

--由于伪代码造成混乱而编辑代码。 (对不起,第一次发帖)

【问题讨论】:

  • Function 不是有效的 C# 关键字。
  • 这段代码有各种各样的问题。编译器错误信息告诉你什么?

标签: c# class inheritance polymorphism pass-by-reference


【解决方案1】:

您必须在方法调用上使用ref 键:

ShowData(ref myB);

其实中的类是参考值,所以你不需要使用ref。当您真的想传递引用时,仅将 ref 用于值类型(intshortdoubledecimalboolDateTime 等结构)。

在你的情况下,你可以使用

object ShowData(A _myvar)
{
 ...
}

【讨论】:

  • 或者,更好的是,删除函数声明中的ref
  • 也许 OP 想要改变调用者的引用?
  • 我还需要更新对象,这就是我需要引用的原因
  • 但是,在 C# 中,类作为引用类型工作,但保留在那里没有问题。在方法的调用中,您必须首先指定ref keywork 作为我的示例。
  • 我不认为简单地在调用中添加ref 会起作用,因为如果使用ref 并且 ShowData 分配一个新值,它可以将任何值分配给 A 或派生自它,但它不一定与变量类型 B 兼容。因此,您只能使用类型 A 的变量调用它。
【解决方案2】:

只需从您的方法声明中删除ref。像这样:

void ShowData(A _myvar)
{
 ...
}

【讨论】:

  • 为什么 ref 关键字不正确?解决方案不是Function(OP)和void(答案)之间的替换吗?
  • @Flater,是的,也不是。我回答时的问题在方法调用中没有ref,只有在声明中。 Function在c#中不是关键字是正确的,所以显然有几个问题。
【解决方案3】:

ref 关键字 doesn't support polymorphicism

如果你可以更改ShowData的签名,那么我建议你改成这样:

  public A ShowData(A _myvar)
  {
     return new B();  // Or A() or whatever.
  }

然后这样调用:

B myB = new B();
myB = ShowData(myB);

或者,您需要为这两个类提供 ShowData 的重载:

  public void ShowData(ref A _myvar)
  {
     _myvar = new B();
  }

  public  void ShowData(ref B _myvar)
  {
     _myvar = new B();
  }

然后编译器可以选择重载:

     A myA = new A();
     B myB = new B();
     ShowData(ref myB);
     ShowData(ref myA);

顺便说一句,ShowData 不是一个好名字。 MutateData 听起来更合适:-)

【讨论】:

  • 确实 MutateData 听起来更好,我只是从我的 Board 复制了伪代码。
  • 确实“多态性”是我想做的。您的链接似乎证实了这对于 c# 是不可能的;但这是一种耻辱。我会继续寻找解决方案。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2011-12-28
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多