具有泛型的类设计

时间:2017-08-16 12:59:40

标签: c# oop generics interface abstract

我最近更多地参与了课堂设计。我无法为以下场景提供良好的课程设计。

我有一个通用的抽象基类,为简单起见,它看起来像这样:

public abstract class ElementDataService<T> where T : Element
{       
    public abstract void InsertElement(T element);
    public abstract void UpdateElement(ElementKey key, T element);
    public abstract void DeleteElement(ElementKey key);
}

然后我有4个继承自它的子类。 E.g:

public class PointElementDataService : ElementDataService<PointElement>
{        
    public override void InsertElement(PointElement point)
    {

    }

    public override void UpdateElement(ElementKey key, PointElement point)
    {

    }

    public override void DeleteElement(ElementKey key)
    {

    }
}

我想实现一个工厂类来创建4个子类中的一个,但似乎没有任何返回类型能够实现这一点。

我想我想在一个对象类型中容纳4个子类中的任何一个,这样我就可以调用insert / update / delete而无需知道它是哪4种类型。

E.g。

public class ElementDataServiceFactory
{
    public static ElementDataService<Element> CreateElementDataService(ElementType type)
    {
        ElementDataService<Element> service = null;

        switch (type)
        {
            case ElementType.Base:
                service = BaseElementDataService.CreateBaseElementDataService();
                break;
            case ElementType.Section:
                service = SectionElementDataService.CreateSectionElementDataService();
                break;
            case ElementType.Point:
                service = PointElementDataService.CreatePointElementDataService();
                break;
            case ElementType.Other:
                service = OtherElementDataService.CreateOtherElementDataService();
                break;
            default:
                break;
        }

        return service;
    }
}

显然,由于铸造问题上述情况不起作用,我也没有尝试过任何其他工作(例如通用工厂方法)。

1 个答案:

答案 0 :(得分:0)

ElementDataService<PointElement>, ElementDataService<BaseElement>等不能强制转换为ElementDataService。

public class PointElementDataService : ElementDataService<Element>
        {
            public override void InsertElement(Element point) { }
            public override void UpdateElement(ElementKey key, Element point) { }
            public override void DeleteElement(ElementKey key) { }

            public static ElementDataService<Element> CreatePointElementDataService()
            {
                return new PointElementDataService();
            }
        }