作为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。
答案 0 :(得分:0)
onPress
不需要演员表的原因是:它是
类型<Picker />
直接包含的定义
GridTarget
。 IGridPoint
属于类型
HasVehicle
。 SelectedTarget
不直接包含
ITargetObjectBase
的定义。所以对ITargetObjectBase
的演员是
需要的。SomeValue
中不需要演员
ITargetObject
包含SelectedTarget.Row
的定义。 在您的情况下,您可以将ITargetObjectBase
变为具有两个通用参数的类型,如下所示。然后你可以在没有演员阵容的情况下致电Row
IGridManagerBase