通过父类加载基类数据

时间:2015-05-04 09:51:00

标签: c#

我有一个类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

我是如何实现这一目标的?

4 个答案:

答案 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)。

以下是when not to use this的示例和when you can use it.

的示例

答案 2 :(得分:2)

您不需要ref关键字。

您正在使用引用类型。如果您修改这两种方法中的FruitApple,则可以修改原始FruitApple

如果您有一种方法可以传入intbool而不将其定义为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; }

希望这会有所帮助。 :)