具有不同派生类型的属性的C#派生类

时间:2019-07-19 11:56:51

标签: c# polymorphism

C#中是否有一种方法可以完成以下任务? 每个容器中的key应该具有相同的属性,即,从childContainer内部引用prop应该访问与baseContainer内部代码相同的对象。

我希望能够在baseContainer中的函数中引用该属性,而其他代码则引用childContainers的属性,而无需将该属性强制转换为更具体的类。当我仅对类型为baseContainer的对象进行引用时,无论该对象的实际类型是什么,我也需要能够使用prop,即我不在乎它是否实际上是派生类型。

如果有人可以提出建议,我愿意使用其他模式进行重构。

prop

希望这很有道理。

上下文: 代码示例中的GetContainer()只是为了说明我有一个baseContainer引用,该引用可以引用派生类之一的对象。一种简化的尝试,使之无需发布数十种我的雇主就不会真正欣赏我发布的IP的数十类和大量IP即可阅读:-)

真正的结构涉及到一个类,该类创建childContainer1或childContainer2的对象(实际应用具有更多派生类,并且最终可能从这些派生类具有更多类,即多个继承级别),并进行了一些处理,依靠它是这种特定类型,然后将其传递到其他不在乎正在使用哪个特定类的其他服务,它们仅处理baseContainer。

不确定这是否对解决方案有所帮助,但有人要求我提供更多上下文。

2 个答案:

答案 0 :(得分:3)

当然,您可以使用泛型来实现!

public class BasePropType { }
public class ChildProp1 : BasePropType { }
public class ChildProp2 : BasePropType { }

public abstract class BaseContainer<T> where T : BasePropType
{
    public T Prop { get; set; }
}

public class ChildContainer1 : BaseContainer<ChildProp1> { }
public class ChildContainer2 : BaseContainer<ChildProp2> { }

这也可以在没有泛型且使用接口的情况下解决。

public interface IBaseType { }
public class ChildProp1 : IBaseType { }
public class ChildProp2 : IBaseType { }

public abstract class BaseContainer
{
    protected BaseContainer(IBaseType type)
    {
        Prop = type;
    }

    public IBaseType Prop { get; private set; }
}

public class ChildContainer1 : BaseContainer
{
    public ChildContainer1()
     : base(new ChildProp1())
    {

    }
}

public class ChildContainer2 : BaseContainer
{
    public ChildContainer2()
     : base(new ChildProp2())
    {

    }
}

答案 1 :(得分:-1)

您还可以使用阴影和投射来实现此目的:

public class baseContainer
{
    public basePropType prop { get; set; }
}

public class childContainer1 : baseContainer
{
    public new childProp1 prop 
    {
        get => (childProp1)base.prop;
        set => base.prop = value;
    }
}

如果由于任何原因baseContainer将prop设置为非childProp1类型的值(在您的情况下不应假定),则这会带来强制转换的开销和无效强制转换的可能性据我了解的前提条件发生。

我认为,最好的方法还是使用一个新属性来避免名称冲突:

public class baseContainer
{
    public virtual basePropType prop { get; set; }
}

public class childContainer1 : baseContainer
{
    public childProp1 childProp { get; set; }

    public override basePropType prop 
    {
        get => childProp;
        set => (childProp1)childProp
    }
}

这避免了对相同属性(看似)的不同类型的困惑,并增加了类型安全性,以防万一将错误的类分配给该属性。