【问题标题】:C# - Override generic type constraints of generic abstract methodsC# - 覆盖泛型抽象方法的泛型类型约束
【发布时间】:2021-07-19 21:49:55
【问题描述】:

是否可以覆盖抽象方法实现的泛型约束?

让我解释一下...通常我会这样做:

public abstract class A
{
    public abstract class IData {}

    public abstract void DoSomething(IData data);
}

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething(IData data)
    {
        DataB d = data as DataB;

        if (d == null)
        {
             // print error or whatever...
             return;
        }

        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething(IData data)
    {
        DataC d = data as DataC;

        if (d == null)
        {
             // print error or whatever...
             return;
        }

        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

我不喜欢的是我可以将无效的参数类型传递给DoSomething 函数。

我希望能够做类似的事情

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething(DataB data)
    {
        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething(DataC data)
    {
        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

这当然是不可能的。

出于这个原因,我最终做了类似的事情:

public abstract class A
{
    public abstract class IData {}

    public abstract void DoSomething<T>(T data) where T : IData;
}

下一步是制作类似的东西

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething<T>(T data) where T : DataB
    {
        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething<T>(T data) where T : DataC
    {
        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

所以,基本上,覆盖我在父类抽象泛型方法中设置的泛型约束。有没有办法做到这一点?

请注意:我不想创建一个泛型类,而只想创建一个泛型方法,该方法能够为每个基类的不同实现获取正确类型的数据。

【问题讨论】:

  • 这可能无效:您已承诺DoSomething 将接受A 中的任何IData。您不能在BC 中改变主意,只接受更多派生类型,即使约束以任何方式变化(它们不是)。在此处仔细考虑您真正想要实现的类型安全(如果有的话)。通常,这种设计通常意味着您正在设置您实际上不想要的继承层次结构,但最好通过扩展方法、具体类或(如果确实需要)new 方法和派生中的显式下级强制转换来完成类。
  • 尝试将类型参数放在A 类而不是DoSomething 方法上
  • 这能回答你的问题吗? Force derived class to implement interface
  • public abstract class A() 中,() 无效。您能否更正代码以使其成为有效的 C#?
  • 语言根本不允许这样做。见:docs.microsoft.com/en-us/dotnet/csharp/misc/cs0460

标签: c# generics overriding abstract-methods


【解决方案1】:

显然,我想要实现的目标目前在 C# 中是不可能的。 等了一会儿看看是否有解决方法后,我决定引用 JasperKent 的评论作为最终答案:

语言根本不允许这样做。 见:docs.microsoft.com/en-us/dotnet/csharp/misc/cs0460

【讨论】:

    【解决方案2】:

    显然它在您编码时不受支持。但是你可以尝试不同的编码,像这样:

    public abstract void DoSomething<T, TConstraint>(T data) where T : TConstraint;
    
    ....
    
    public override void DoSomething<T, DataB>(T data){ //your code here; }
    ....
    
    public override void DoSomething<T, DataC>(T data){ //your code here; }
    

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多