Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现通用接口重写时的限制_C#_Inheritance_Polymorphism - Fatal编程技术网

C# 实现通用接口重写时的限制

C# 实现通用接口重写时的限制,c#,inheritance,polymorphism,C#,Inheritance,Polymorphism,如果我有以下接口和类: public interface IPopulationUnit<T> { IPopulationUnit<T> Breed(); } public abstract class PopulationUnit<T>:IPopulationUnit<T> { public abstract PopulationUnit<T> Breed(); } 然后我有了一个实现 class StringU

如果我有以下接口和类:

public interface IPopulationUnit<T>
{
    IPopulationUnit<T> Breed();
}

 public abstract class PopulationUnit<T>:IPopulationUnit<T>
{
    public abstract PopulationUnit<T> Breed();
}
然后我有了一个实现

class StringUnit : PopulationUnit<string>
{        
    public override StringUnit Breed()
    {

    }
}
代码没有编译,因为Breed方法与IPopulationUnit类型不匹配,但从技术上讲,它不匹配吗?我的意思是,StringUnit本身就是PopulationUnit,它本身就是I PopulationUnit,所以我认为它会起作用


如何将StringUnit繁殖方法限制为仅返回类型StringUnit,但遵守继承规则?

这似乎可行,将T1添加到接口和抽象实现中:

    public interface IPopulationUnit<T, T1> where T1 : IPopulationUnit<T, T1>
    {
        T1 Breed();
    }

    public abstract class PopulationUnit<T> : IPopulationUnit<T, PopulationUnit<T>>
    {
        public abstract PopulationUnit<T> Breed();
    }

    class StringUnit : PopulationUnit<string>
    {
        public override PopulationUnit<string> Breed()
        {
            return new StringUnit();
        }
    }

如果我将覆盖定义为StringUnit品种,说它必须返回PopulationUnit才能覆盖品种,但实际上可以从方法本身返回StringUnit,那么仍然会出现错误。

定义中的返回类型必须与接口完全匹配

但是,您可以自由返回实现该接口的任何内容:

public abstract class PopulationUnit<T>:IPopulationUnit<T>
{
    public abstract IPopulationUnit<T> Breed();
}

class StringUnit : PopulationUnit<string>
{        
    public override IPopulationUnit<string> Breed()
    {
        return new StringUnit(); 
    }
}

Oekelens很接近。。。如果您真的出于某种奇怪的原因想这样做,请对其施加一些限制:

public interface IPopulationUnit<T, T1> where T1 : IPopulationUnit<T, T1>
{
    T1 Breed();
}

public abstract class PopulationUnit<T, T1> : IPopulationUnit<T, T1> where T1 : PopulationUnit<T, T1>
{
    public abstract T1 Breed();
}

public class StringUnit : PopulationUnit<string, StringUnit>
{        
    public override StringUnit Breed()
    {
        throw new NotImplementedException();
    }
}
为什么它不能像你一样工作?因为类必须实现声明的接口;包括返回类型。您可以返回您喜欢的任何内容,但必须在定义中以与接口相同的方式引用它。

StringUnit2:PopulationUnit符合方法的标准,但不能强制转换为StringUnit。您不能像那样更改方法签名是有道理的。你也许可以用协方差做点什么;我在公共抽象填充单元上得到一个错误;已经因为它不认为这是一个IPopulationUnit。。。