0

我有一个简单的 Error 基类,出于这个问题的目的,它有一个表示可能的错误值的 int 。

我有一个从这个错误基类派生的 ErrorMultiple 类,它有一个整数列表,这样我就可以保存多个错误值。

我希望有一个 Event 类,其中包含一个 Error 基类的单个实例。

因此,我创建了一个 Event 实例并将其传递给许多方法。其中一个决定“哦,不。我们发现有多个错误需要报告。”

如何编写代码让我的 Event 对象丢弃它的 Error 基类实例并通过 Event.ReplaceErrorObjWithMultipleErrorObj() 将其替换为 ErrorMultiple 类的实例

public class Error
{
    protected int ErrorNo;
}
public class ErrorMultiple : Error
{
    Protected List<int> MultipleErrorNos;
}
public class Event
{
    Error   *   errorObject;
}

Public Event()
{
    errorObject = new Error();
}

void Event.ReplaceErrorObjWithMultipleErrorObj()
{
    errorObject = new ErrorMultiple();
}

当然,事件声明在真正的 C# 语法中是垃圾。我不知道如何声明对可替换对象实例的引用。

4

1 回答 1

1

问题 #01 - 值类型和引用类型 在 C++ 中,对象是值类型 - 其组件的结构。要引用存在于内存中的值,请使用指针。C# 不是这样的。在 C# 中,默认情况下对象是引用,就对象而言,没有值类型。(为了让事情变得更简单,这有点谎言)

这意味着在 C# 中:

ErrorClass error = new ErrorClass();

在 C++ 中与此等效:

ErrorClass* error = new ErrorClass();

然而,关键的区别在于,没有办法像取消引用 C++ 中的指针那样取消引用 C# 引用。

此外,这在 C# 中:

error.ErrorNumber = 0;

等效于 C++ 中的这个:

error->ErrorNumber = 0;

实际上正在发生的事情是,所有的指针魔法都对用户隐藏,以防止指针错误并确保没有指针管理干扰托管语言的垃圾收集(当对象完成时删除对象的系统,即它们超出范围)。

问题 #02 - 语法 在 C# 中,编译器与 C++ 的编译器有很大不同。它更智能且不那么严格,尽管它缺少一些功能,如真正的定义和宏。

首先,类必须将其所有的字段和方法完全包含在一个块中,你不能声明一个类的基本结构,然后再声明事物的定义。即,您不能这样做:

class ErrorClass { public: void PrintError(); }
void ErrorClass::PrintError() { printf("error"); }

因为方法的定义必须在类的主体内,像这样:

class ErrorClass { public void PrintError() { Console.Write("error"); } }

但是,您不必在使用函数之前声明函数的名称,编译器不一定按照编写的顺序读取您的代码。

总结一下,我将用正确的 C# 形式重写你的代码,这样你就可以看到事情的样子:

public class Error
{
    protected int ErrorNo;
}
public class ErrorMultiple : Error
{
    protected List<int> MultipleErrorNos = new List<int>();
}
public class Event
{
    Error errorObject = new Error();
public void MultiplyErrors()
{
    errorObject = new ErrorMultiple();
}
}

请注意,首先,错误编号无法读取,因为它们受到保护,其次,C# 有一个基于异常的系统,使用 try、catch、finally 和 throw 语句,类似于更现代的 C++。

推荐阅读:

于 2013-07-08T12:30:25.910 回答