【问题标题】:Inheritance design: How to make a method operate on base class (C#)继承设计:如何使方法在基类上运行(C#)
【发布时间】:2013-01-23 19:28:34
【问题描述】:

我希望这个问题的标题能准确地概括问题。以下是详细信息:

我有两个共享多个属性和相关方法的类,让我们来看看 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 实现了接口,因此我应该能够将此类的所有对象都视为类型接口,不是吗?

我在这里错过了什么?

【问题讨论】:

标签: c# class inheritance interface abstract


【解决方案1】:

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

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

只有在您要替换整个对象的情况下才需要 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() 将完全按照您的意愿工作。

【讨论】:

  • 非常感谢,詹姆斯。就是这样。我删除了引用标记,并且该方法接受基类接口作为参数。伟大的! :)
【解决方案2】:

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

C# 不是 C++。 不会在没有ref 关键字的情况下创建整个对象的副本。它会将对象的引用副本(基本上是指针)传递给方法。

【讨论】:

  • 非常感谢,德米特里。你是对的,我假设如果我在没有 ref 关键字的情况下传递整个对象,则会创建整个对象的副本。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2011-05-10
  • 2015-11-16
  • 2013-09-06
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多