0

可能我无法用语言准确解释我想要实现的目标,但我认为这个示例代码可以做到:

class A
{
    public string Name
    {
        get;
        set;
    }
    public virtual void Say()
    {
        Console.WriteLine("I am A");
        Console.Read();
    }

    public bool ExtendA;

    public A GetObject()
    {
        if (ExtendA)
            return new B();

        return this;
    }
}

internal class B : A
{
    public override void Say()
    {
        Console.WriteLine(string.Format("I am {0}",Name));
        Console.Read();
    }
}

class Program
{
    static void Main(string[] args)
    {          
       var a = new A() {ExtendA = true,Name="MyName"};
        A ab = a.GetObject();            
    } 
}

根据上面的代码,当字段 Exitend A 设置为 true 时,当我再次尝试从同一对象实例获取相同类型的对象时,我得到了该对象,但它丢失了属性“名称”的值。

有什么建议我怎样才能返回具有 A 属性的 B 类?

谢谢

4

2 回答 2

5

我建议您阅读有关设计模式的书籍或其他资源。为此,您将使用工厂模式。

除了 class和 class 之外,您还有 base classA和class 。AFactoryB : ABFactory

在运行时,您可以选择要实例化的内容:A 或 B 使用工厂:

IFactory 工厂 = iWantClassA ?新 AFactory() : 新 BFactory(); A a = factory.CreateInstance();

尽管我同意@ArnaudF 的观点,但我看不出您要完成什么。为什么不直接创建子类 B?

更新:

重新阅读您的问题后,听起来您真的只需要在课堂上使用一个复制构造函数,如下所示:

public class A {
    public A() {
        // Default constructor
    }
    public A(A other) {
        // Copy-constructor. Members of other will be copied into this instance.
    }
}

public class B : A {
    public B() {

    }
    public B(A other) : base(other) { // Notice how it calls the parent class's copy-constructor too
    }
}

然后在运行时将 A 的实例“升级”为 B 的实例,只需使用复制构造函数:

A a = new A();
// some logic here
B upgradedA = new B( a );
于 2012-06-21T14:45:33.913 回答
1

我不确定你的最终目标是什么,但我想让你知道 ExpandObject 类型,以防你不知道它。

这使您可以在运行时向对象动态添加属性和方法,如以下代码所示:

using System;
using System.Dynamic;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic expando = new ExpandoObject();

            expando.Name = "Name";  // Add property at run-time.
            expando.PrintName = (Action) (() => Console.WriteLine(expando.Name)); // Add method at run-time.

            test(expando);
        }

        private static void test(dynamic expando)
        {
            expando.PrintName();
        }
    }
}
于 2012-06-21T15:03:10.873 回答