【问题标题】:Inheritance and generics c# [duplicate]继承和泛型c# [重复]
【发布时间】:2017-05-30 20:08:54
【问题描述】:

我有以下抽象类:

public abstract class PinkBoxMasksDataAbstract
{
    public string PinkBoxText { get; set; }
}

和 2 个子类:

public class PinkBoxMasksDataNoOverlay : PinkBoxMasksDataAbstract
{
}

public class PinkBoxMasksDataOverlay : PinkBoxMasksDataAbstract
{
    public int PinkBoxLeft { get; set; }
    public int PinkBoxBoxTop { get; set; }
    public int PinkBoxHeight { get; set; }
    public int PinkBoxWidth { get; set; }
}

然后我有另一个类,它有 PinkBoxMasksDataAbstract 类作为参数:

public class ZonalMatchResult<T> where T : PinkBoxMasksDataAbstract
{
    public decimal Confidence { get; set; }
    public int GreenBoxLeft { get; set; }
    public int GreenBoxTop { get; set; }
    public int GreenBoxHeight { get; set; }
    public int GreenBoxWidth { get; set; }

    public List<T> PinkBoxMasksData { get; set; }
}

public class ZonalResult<T> where T : PinkBoxMasksDataAbstract
{
    public int ExitCode { get; set; }
    public string ErrorMessage { get; set; }
    public int NumberOfGreenBoxMatches { get; set; }
    public int NumberOfPinkBoxExtractFrames { get; set; }
    public int ProcessingTime { get; set; }
    public bool HasOverlay { get; set; }

    public List<ZonalMatchResult<T>> MatchResults { get; set; }
}

现在我想这样创建这个类:

            ZonalResult<PinkBoxMasksDataAbstract> zonalResult;
            if (isOverlayRequired)
                zonalResult = new ZonalResult<PinkBoxMasksDataOverlay>();
            else
                zonalResult  = new ZonalResult<PinkBoxMasksDataNoOverlay>();

但我得到一个错误:

不能隐式转换类型 'Domain.ZonalResult&lt;Domain.PinkBoxMasksDataOverlay&gt;''Domain.ZonalResult&lt;Domain.PinkBoxMasksDataAbstract&gt;'

如果 PinkBoxMasksDataOverlay 是 PinkBoxMasksDataAbstract 的子类,为什么会发生这种情况?如何解决?

【问题讨论】:

  • 创建一个非泛型的ZonalMatchResultBase 类并从中继承ZonalMatchResult&lt;T&gt;,然后您可以使用基类型来存储任何泛型实例。
  • ZonalMatchResult&lt;PinkBoxMasksDataOverlay&gt;ZonalMatchResult&lt;PinkBoxMasksDataNoOverlay&gt; 除了object 之外没有共同的基类。类型参数的继承关系在这里无关紧要;如果它们不同,它们就是不同的。
  • @Gusman,我有一个很深的子类。真正的 ZonalMatchResult 只是嵌套类链
  • 我在代码示例中看不到这一点,如果示例错误,则使用正确的数据更新它。
  • 你的问题只是另一个常见问题的例子 “为什么即使我的类型参数 T1 继承了另一个类型参数 T2,我的泛型类型 G继承泛型类型 G"。有关最早的示例之一,请参见标记的副本。有很多,它们都归结为同一件事:您想要的继承关系仅在非常特定的条件下有效,而您的代码不满足这些条件。如果没有这些条件,处理泛型类型的实例时可能会出现不安全的行为。

标签: c# generics inheritance


【解决方案1】:

ZonalMatchResult 不继承自 PinkBoxMasksDataAbstract,只有它的类型参数可以。这就是原因,您会收到此错误。

你可以专门用这种方式设置数据(当然在这种情况下它可能不是抽象的):

ZonalMatchResult<PinkBoxMasksDataAbstract> r = new ZonalMatchResult<PinkBoxMasksDataAbstract>;
if (isOverlayRequired)
    r.PinkBoxMasksData = new PinkBoxMasksDataOverlay();
else
    r.PinkBoxMasksData = new PinkBoxMasksDataNoOverlay();

但是,为什么不简单地使用具有 Overlay 属性的 PinkBoxMasksData 类。如果此属性为 null,则您没有 Overlay。

public class Overlay
{
    public int PinkBoxLeft { get; set; }
    public int PinkBoxBoxTop { get; set; }
    public int PinkBoxHeight { get; set; }
    public int PinkBoxWidth { get; set; }
}

public class Mask
{
    public string PinkBoxText { get; set; }
    public Overlay Overlay { get; set; }
}


var mask = new Mask();
if (isOverlayRequired)
{
    mask.Overlay = new Overlay();
}

对于接口,还有covariance 的选项,但对于类是不可能的。所以不,我认为没有办法。

【讨论】:

  • 问题是生成json文件。它创建嵌套结构,如:“PinkBoxText”:“75 个评论\r\n”,“PinkBoxCoordinates”:{“PinkBoxLeft”:179,“PinkBoxBoxTop”:532,“PinkBoxHeight”:20,“PinkBoxWidth”:65 },但是我需要没有 PinkBoxCoordinates 属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多