0

从本质上讲,我试图廉价地引用一个基础对象,以便以后可以完全构建它,并且可以很容易地被不直接参与该对象构建过程的任何东西引用。但是,当我有一个在构建过程中有意义的对象时(它实际上是一个工厂,它创建了其他使用 a 的对象,这些对象依赖于“a”,并且在 switch 案例中构建这些对象是有意义的。)

我考虑过使用指针,但我认为它们不合适。

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% 的把握是这种情况,并且不知道如何在不使用指针的情况下保留它。

问题:

我该如何进行这项工作?我需要改变我的结构吗(可能)?我可以在保持ClassAClassB最小更改的ClassC同时做到这一点Program吗?

4

1 回答 1

1

您需要阅读 MSDN 中的参考资料页面,它非常详细地解释了如何执行此操作:http: //msdn.microsoft.com/en-us/library/14akc2c7.aspx

话虽如此,虽然 'ref' 关键字可以在不修改太多代码的情况下解决这个特定问题,但引用尚未实例化的对象的编码风格很糟糕。您可能应该重构代码以正确尊重实例化顺序,例如通过将 ClassB 的实例传递给 c 的“运行”方法。

于 2013-04-12T14:44:08.690 回答