继承设计:如何使方法在基类 (C#) 上运行

本文关键字:基类 运行 方法 何使 继承 | 更新日期: 2023-09-27 17:55:54

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

我有两个共享多个属性和相关方法的类,让我们 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#) 上运行

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

如果它们是引用

类型(即类)(并且它们是),并且您只对它们设置属性,则不需要通过引用传递它们。 (通过引用传递引用是具有指向指针的指针)

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

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

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