首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂模式

抽象工厂模式
EN

Stack Overflow用户
提问于 2011-01-27 19:18:59
回答 2查看 511关注 0票数 2

我有一个类CMyDataClass来存储数据,它有三个成员变量和两个构造函数,如下所示

代码语言:javascript
复制
public class CMyDataClass
{
    public String strIndex, strName;
    public int nType;
    public CMyDataClass()
    {
        strIndex = "";
        strName = "";
        nType = 0;
    }
    public CMyDataClass(String ind, String name, int ty)
    {
        strIndex = ind;
        strName = name;
        nType = ty;
    }
}

在另一个类(CMain)中,我有一个List<CMyDataClass>,它包含两个对象,例如

代码语言:javascript
复制
 List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { new CMyDataClass("", "", 1), 
                                                             new CMyDataClass("", "", 2) };

我有两个继承CMyDataClass的子类,每个子类都包含一个填充数据结构的函数。

子类中的函数将根据ntype填充对象。

下面是我的子类

代码语言:javascript
复制
//Class One

class COne : CMyDataClass
{
    public static bool FillData(CMyDataClass objCMDClass)
    {
        if (objCMDClass.nType == 1)
        {
            objCMDClass.strIndex = "Index-One";
            objCMDClass.strName = "One";
            return true;
        }
        return false;
    }
}



//Class Two

class CTwo : CMyDataClass
{
    public static bool FillData(CMyDataClass objCMDClass)
    {
        if (objCMDClass.nType == 2)
        {
            objCMDClass.strIndex = "Index-Two";
            objCMDClass.strName = "Two";
            return true;
        }
        return false;
    }
}

CMain类中,我执行子类函数,例如

代码语言:javascript
复制
 public void Func()
    {
        for (int index = 0; index < lstMyDataList.Count; index++)
        {
            if (COne.FillData(lstMyDataList[index]) == false)
                if (CTwo.FillData(lstMyDataList[index]) == false)
                    MessageBox.Show("No data found");
        }
    }

现在的问题是:如果COneCTwo填充了数据对象,它将返回一个CMyDataClass类型的对象。但是我需要子类的对象,也就是说,如果COne填充了这个对象,那么这个对象应该是COne类型的,或者如果是CTwo,那么这个对象应该是CTwo对象。

因此我将我的Child类更改为

代码语言:javascript
复制
class COne : CMyDataClass
  {
    public static bool FillData(CMyDataClass objCMDClass)
    {
        if (objCMDClass.nType == 1)
        {
            COne obj=new COne();
            obj.strIndex = "Index-One";
            obj.strName = "One";
            objCMDClass=obj
            return true;
        }
        return false;
    }
}

但这不会填充lstMyDataList中的对象,因为它会创建一个新对象。

如果我的CMyDataClass是抽象的,我可以使用type cast。但是如果我把它设为抽象的,我就不能像下面这样填充lstMyDataList (对象类型未知)。

代码语言:javascript
复制
 List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { new CMyDataClass("", "", 1), new CMyDataClass("", "", 2) };

根据哪个类填充了对象,如何将对象转换为child类型?

提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2011-01-27 19:45:02

您不能将对象强制转换为子类型,因为它不是子类型的实例。您不是在使用继承,而是在创建CMyDataClass的实例,并根据参数以不同的方式初始化它们。

很难说你到底需要或想要什么,而且,考虑到这一点,还不清楚这里是否需要继承。但如果它是你想要的工厂,它可能是这样的:

代码语言:javascript
复制
    public class CMyDataClass
    {
        // ...snipped definition...
        public CMyDataClass(int type)
        {
            nType = type;
        }        

        public virtual void FillData()
        {
        }

        static public CMyDataClass Create(int type)
        {
            switch (type)
            {
                case 1:
                   return new COne(type);
                case 2:
                   return new CTwo(type);
                default:
                   return null // or throw an exception, whatever is appropriate
            }
        }
    }

    public class COne : CMyDataClass
    {
         public COne(int type)
             : base(type)
         {
         }

         public override void FillData()
         {
              strIndex = "Index-One";
              strName = "One";             
         } 
    }

    public class CTwo : CMyDataClass
    {
         public CTwo(int type)
             : base(type)
         {
         }

         public override void FillData()
         {
              strIndex = "Index-Two";
              strName = "Two";             
         } 
    }

//....
    List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { CMyDataClass.Create(1), 
                                                                 CMyDataClass.Create(2) }
//....

//....
    public void Func()
    {
        for (int index = 0; index < lstMyDataList.Count; index++)
        {
            lstMyDataList[index].FillData();
        }
    }
//....
票数 5
EN

Stack Overflow用户

发布于 2011-01-27 19:48:07

如何将CMyDataClass包装在另一个类中,并将新类的实例放在列表框中?然后,您可以在内部拥有COne或CTwo的实例,这取决于填充它的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4815643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档