从派生类访问基类属性时避免强制转换

时间:2016-09-27 04:18:04

标签: c# casting

作为C#的菜鸟,我正努力围绕用我的场景进行投射的最佳解决方案,基本上我试图避免从派生类中投射基类对象。

在GridManagerBase类中的示例中,GridTarget属性由泛型定义定义,但SelectedTarget使用基本接口,从GridManager类开始,需要我进行转换以获取对其他属性的访问权。

所以我试图在没有铸造的情况下找出一个干净的解决方案。

我在网上搜索过很多例子,但我找不到我想要的答案,所以真的在寻找任何建议。

非常感谢。

<p>I'll grow larger and smaller<p>

更新 好吧,所以我的主要目标是拥有多个GridManager,其他对象具有共同的功能,所以我的想法是使用基本接口来实现这一点。

从GridManager中,SelectedTarget(ITargetObjectBase)对象将具有通用逻辑,这在GridManager中也很好,但也是唯一的逻辑。

在我提出这个问题之前,我确实考虑过Prasanna建议的路线,应该提到的,有点为什么我离开了IVehicleObjectBase,但是我不确定创建几个通用定义有什么指导方针

我已经添加了一些具体类的附加代码,希望能更好地了解我的目标。

public class GridManager : GridManagerBase<IGridPoint>
{
    void DoWork()
    {
        var result = GridTarget.HasVehicle; // works

        var result2 = ((ITargetObject)SelectedTarget).SomeValue; // works with cast
    }
}

public abstract class GridManagerBase<TGridPoint> : IGridManagerBase<TGridPoint>
       where TGridPoint : class, IGridPointBase
{
    public TGridPoint GridTarget { get; protected set; }

    public ITargetObjectBase SelectedTarget { get; protected set; }

    //public IVehicleObjectBase SelectedVehicle { get; protected set; }
}

public interface IGridManagerBase<TGridPoint>
{
    TGridPoint GridTarget { get; }

    ITargetObjectBase SelectedTarget { get; }
}

public interface IGridPointBase
{
    int Row { get; }
}

public interface IGridPoint : IGridPointBase
{
    bool HasVehicle { get; }
}


public interface ITargetObjectBase
{
    int Row { get; set; }
}

public interface ITargetObject : ITargetObjectBase
{
    int SomeValue { get; }
}

所以我认为我最好的两个选项要么是通用定义路由,要么从GridManagerBase中删除ITargetObjectBase属性,只需要在IGridManager接口中使用ITargetObject。

1 个答案:

答案 0 :(得分:0)

  • onPress不需要演员表的原因是:它是 类型<Picker />直接包含的定义 GridTarget
  • 然而,IGridPoint属于类型 HasVehicleSelectedTarget不直接包含 ITargetObjectBase的定义。所以对ITargetObjectBase的演员是 需要的。
  • SomeValue中不需要演员 ITargetObject包含SelectedTarget.Row的定义。

在您的情况下,您可以将ITargetObjectBase变为具有两个通用参数的类型,如下所示。然后你可以在没有演员阵容的情况下致电Row

IGridManagerBase