0

基本上,我想做这样的事情:

public class A
{
    public void AddData(byte[] Data)
    {
        //analyze data
        if (BoolFromAnalyzedData == true)
        {
            AFirstType a = new AFirstType();
            a.SomeInt = IntFromAnalyzedData;
            this = a;
        }
        else
        {
            ASecondType a = new ASecondType();
            a.SomeString = StringFromAnalyzedData;
            this = a;
        }
    }
}
public class AFirstType : A
{
    public int SomeInt;
}
public class ASecondType : A
{
    public string SomeString;
}

然后,我希望能够做到这一点:

a.AddData(data);
if (a is AFirstType)
    DoStuff((a as AFirstType).SomeInt);
else if (a is ASecondType)
    DoStuff((a as ASecondType).SomeString);

我有一个类,然后是两个具有不同属性的派生类。当我创建基类时我不知道它应该是哪种类型,我只能在我获取一些数据并分析它时了解它是哪种类型。然后,我希望能够检查它是哪种类型并使用派生类的属性。

问题是,我不能this在 C# 中使用,那么我可以使用什么替代方法?

4

4 回答 4

1

我认为您应该改变解决问题的方法。

您将您的实体(存储数据)与您的水合代码(填充它们)混合在一起。

A您应该将这两种行为分开,并可能使用工厂类根据您提供的数据创建特定类型。

public class A 
{ 
   //Common Stuff
}

public class AFirstType : A
{
    public int SomeInt {get;set;}
}
public class ASecondType : A
{
    public string SomeString {get;set;}
}

public class AFactory 
{
    public static void Create(byte[] Data)
    {
        //analyze data
        if (BoolFromAnalyzedData == true)
        {
            return new AFirstType() 
                       {
                           SomeInt = IntFromAnalyzedData
                       };
        }
        else
        {
            return new  ASecondType() 
                        {
                           SomeString = StringFromAnalyzedData
                        };
        }
    }
}

///Main Code

byte [] data = GetData();
A someA = AFactory.Create(data);
if (a is AFirstType)
    DoStuff((a as AFirstType).SomeInt);
else if (a is ASecondType)
    DoStuff((a as ASecondType).SomeString);
于 2013-06-21T16:30:29.513 回答
1

一旦将类实例化为特定类型,就无法更改该类型,至少据我所知。

我的建议是在你知道它是什么类型之前不要实例化它。


也许您正在寻找这种模式(注意它如何创建和返回一个类而不是更改类)

public static A AddData(byte[] Data)
{
    //analyze data
    if (BoolFromAnalyzedData == true)
    {
        AFirstType a = new AFirstType();
        a.SomeInt = IntFromAnalyzedData;
        return a;
    }
    else
    {
        ASecondType a = new ASecondType();
        a.SomeString = StringFromAnalyzedData;
        return a;
    }
}

然后你可以调用它

A a = AddData(mydata);

您还可以设计您的基类,以便它可以完成您提议的派生类所做的所有事情。这一切都取决于您的要求。

于 2013-06-21T16:28:13.940 回答
0

我是否正确理解您希望让特定类型根据您推入其中的数据而变化,但您希望保留一些驻留在“A”基类中的状态,这样您就不能完全创建一个新对象?

  • 你可以有一个工厂方法,它接受一个“A”的实例和一组数据作为参数,返回一个由数据决定的类型的新对象,但它也包含传递对象的状态。
  • 您可以通过使 AFirstType 和 ASecondType 完全不相关,但都具有对 A 实例的引用(没有任何一个从它派生)来扭转整个事情。
  • 您应该研究基于组合的模式(如状态和策略)。
于 2013-06-21T16:45:13.280 回答
0

DoStuff方法移入基类怎么样?与其询问班级类型并根据该信息做出决定,您只需告诉班级做一些事情,它将决定对其内部状态做什么(告诉,不要问):

public class A
{
    public void AddData(byte[] Data)
    {
        // add data    
    }

    public void DoStuff()
    {
        if (BoolFromAnalyzedData)
        {
            int value = IntFromAnalyzedData;
            // do stuff with value
        }
        else
        {
            string value = StringFromAnalyzedData;
            // do other stuff
        }
    }
}

实际上,在这种情况下,您不需要任何子类。您的代码将如下所示:

a.AddData(data);
a.DoStuff();
于 2013-06-21T16:30:02.087 回答