-2

我希望这个问题的标题准确地总结了这个问题。以下是详细信息:

我有两个类共享几个属性和相关方法,让我们来看看 MyFirstClass 和 MySecondClass。因此,我将这组相交的属性放入我的两个类都继承自的抽象类中:MyAbstractBaseClass。

到目前为止,一切都很好。但是,在我代码中其他地方的方法中,我正在操作这些共享属性,并希望能够通过引用将 MyFirstClass 和 MySecondClass 的实例传递给此方法。就像是:

result1 = myMethod(ref MyFirstClass);
result2 = myMethod(ref MySecondClass);

我尝试使用 MyAbstractBaseClass 作为我的方法的参数类型:

public bool myMethod(ref MyAbstractBaseClass anObject)

但这不被编译器接受。我还尝试从 MyAbstractBaseClass 中提取接口,并让 MyFirstClass 和 MySecondClass 都从 MyAbstractBaseClass 继承并实现接口,如下所示:

public class MyFirstClass : MyAbstractBaseClass, IMyAbstractBaseClass 
public class MySecondClass : MyAbstractBaseClass, IMyAbstractBaseClass 

然后,我期望 myMethod 能够对这两个类进行操作,如果我将接口的参数设置为 IMyAbstractBaseClass 类型(毕竟,在 OOP 中,您应该尽可能针对接口进行编码)。

public bool myMethod(ref IMyAbstractBaseClass anObject)

IMyAbstractBaseClass myObject = new MyFirstClass();
result1 = myMethod(ref myObject);

这也行不通。编译器说不可能将 MyFirstClass 转换为 IMyAbstractBaseClass,这对我来说似乎很奇怪,因为 MyFirstClass 实现了接口,因此我应该能够将此类的所有对象都视为类型接口,不是吗?

我在这里想念什么?

4

2 回答 2

1

参数真的需要通过ref传递吗?

如果它们是引用类型(即类)(它们是),并且您只是在它们上设置属性,那么它们不需要通过引用传递。(通过引用传递引用是有一个指向指针的指针)

只有在您将替换整个对象的情况下,您才需要参考:

public bool myMethod(ref IMyAbstractBaseClass anObject)
{
      myObject = new MyFirstClass();
      return true;
}

public bool myMethod2(MyAbstractBaseClass anObject)
{
      myObject.SomeProperty = 5;
      return true;
}

IMyAbstractBaseClass myObject = new MyFirstClass();
result1 = myMethod(ref myObject);
result1 = myMethod2(myObject);

myMethod2() 将完全按照您的意愿工作。

于 2013-01-23T19:36:34.857 回答
1

不要通过引用传递参数,除非出于某种奇怪的原因您需要将方法参数分配给不同的对象,这通常不是要走的路。“Ref”参数不支持抽象类。

C# 不是 C++。如果没有关键字,它不会创建整个对象的副本。ref它将对象的引用(基本上是指针)的副本传递到方法中。

于 2013-01-23T19:37:12.773 回答