本质上,我试图廉价地引用一个基础对象,以便以后可以完全构建它,并且可以通过该对象的构建过程中没有直接参与的任何东西轻松引用。但是,当我有一个在构建过程中构造有意义的对象时(它实际上是一个创建其他使用依赖于“a”的对象的工厂,并且在switch case中构建这些对象是有意义的。)< / p>
我考虑过使用指针,但我认为它们不合适。
using System;
namespace ConsoleApplication5
{
class ClassA
{
public virtual void hello()
{
Console.WriteLine("Hello World!");
}
}
class ClassB : ClassA
{
public override void hello()
{
Console.WriteLine("Goodbye World!");
}
}
class ClassC
{
ClassA m_object;
public ClassC(ClassA a)
{
m_object = a;
}
public void run()
{
m_object.hello();
Console.WriteLine(m_object.GetType().ToString());
}
}
class Program
{
static void Main(string[] args)
{
ClassA a;
ClassC c = new ClassC(a);
//switch(something)
//{
//case "somethingElse":
a = new ClassB();
c.run();
//...
//break;
//...
//}
//CompleteAGenericCollationTaskWith(a);
}
}
}
基本上:
我正在尝试:在对象创建之前将对象的共享引用传递给对象,以便我可以从第二个对象内部(最好)对其进行只读访问。
我怀疑它与a = new ClassB();
覆盖引用有关,但我只有大约60%确定是这种情况,并且不知道如何在不使用指针的情况下保留它。
问题:
如何使这项工作?我是否需要改变我的结构(可能)?我是否可以在保留ClassA
和ClassB
的同时对ClassC
和Program
进行最少的更改?
答案 0 :(得分:1)
您需要阅读MSDN中的参考页面,它解释了如何非常详细地执行此操作:http://msdn.microsoft.com/en-us/library/14akc2c7.aspx
话虽如此,虽然'ref'关键字将解决这个特定的问题,而不需要修改太多的代码,但是它引用了一个糟糕的编码风格来引用一个尚未实例化的对象。您应该重构代码以正确地尊重实例化顺序,例如将ClassB的实例传递给c的'run'方法。