我有一个类Fruit
,它有很多变量:mass, taste
......等等。
我找到了一个类Apple
,其中添加了一些变量:size, texture
...等等。
我编写了一个简单的函数来加载Fruit变量,并且不想复制所有它来填充Apple变量。
public void ReadFruitData(string Name, ref Fruit newFruit);
public void ReadAppleData(string Name, ref Apple newApple);
我希望从ReadFruitData
致电ReadAppleData
,但不太确定该怎么做,因为我无法通过newApple
newFruit
class Apple : Fruit
我是如何实现这一目标的?
答案 0 :(得分:5)
嗯,实际上你可以。
如果您的Apple
类继承Fruit
,则可以将派生类型的实例传入该方法。实际问题是使用ref
关键字。
尝试写出ref
。如果您不是真的需要,请不要使用它,或者使用返回值来回馈新创建的实例。
如果您只是更新newApple
中的值,则可以省略ref
并且它有效:
public void ReadFruitData(string Name, Fruit newFruit)
{ }
public void ReadAppleData(string Name, Apple newApple)
{
ReadFruitData(Name, newApple);
}
答案 1 :(得分:4)
在ReadAppleData内部使用临时变量来执行此操作:
Fruit TempFruit = (Fruit)newApple;
ReadFruitData(Name, ref TempFruit);
// carry on with the rest of your code
注意:如果您尝试直接发送newApple,这是针对那个讨厌的编译器抱怨The best overloaded method match for... has some invalid arguments
的解决方法。
它不适合任何情况。
如评论中提到的Patrick Hofman,如果ReadFruitData
为ref参数指定了Fruit
的新实例,则这不是您的解决方案。 (在这种情况下,您应该使用out
代替ref
)。
答案 2 :(得分:2)
您不需要ref
关键字。
您正在使用引用类型。如果您修改这两种方法中的Fruit
或Apple
,则可以修改原始Fruit
或Apple
。
如果您有一种方法可以传入int
或bool
而不将其定义为ref
参数,并修改方法内的值,则原始值变量不会改变。
请参阅:
答案 3 :(得分:-3)
修改你的功能定义 ReadFruitData(string Name,ref Fruit newFruit)来 ReadFruitData(string Name,ref Object newFruit)
在你的方法中,做一个演员。
e.g。 ReadFruitData(string Name,ref Object newFruit) { 水果myFruit = newFruit as Fruit; 要么 Apple myApple = newFruit作为Apple; }
希望这会有所帮助。 :)