Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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中创建通用接口#_C#_.net_Generics_C# 4.0 - Fatal编程技术网

C# 在C中创建通用接口#

C# 在C中创建通用接口#,c#,.net,generics,c#-4.0,C#,.net,Generics,C# 4.0,我知道标题可能会令人困惑(甚至误导),但我计划创建一个泛型接口,它应该实现一个包含泛型参数的方法 在类affirst中实现时,它应该有一个返回类型a的方法MyMethod(),在类BFirst中实现时,它应该有一个返回类型B的方法MyMethod()。我需要这个功能,因为a和B(以及许多其他)之间存在继承关系我需要一个通用方法,我可以用任何基类调用它 如果让人困惑,请看一看我想做什么: 假设B源于A。 考虑AFirst和BA1的实现: IMY接口< /代码>和 iMyPosie >: BFirs

我知道标题可能会令人困惑(甚至误导),但我计划创建一个泛型接口,它应该实现一个包含泛型参数的方法

在类
affirst
中实现时,它应该有一个返回类型a的方法
MyMethod()
,在类
BFirst
中实现时,它应该有一个返回类型B的方法
MyMethod()
。我需要这个功能,因为a和B(以及许多其他)之间存在继承关系我需要一个通用方法,我可以用任何基类调用它

如果让人困惑,请看一看我想做什么:

假设B源于A。 考虑AFirst和BA1的实现:<代码> IMY接口< /代码>和<代码> iMyPosie >:

BFirst mySecondObj = new BFirst();
A myA = BFirst.MyMethod<A>();
B myB = BFirst.MyMethod<B>();
我试图以这种方式实现,但当我单击implement时,我得到的结果如下:

class AFirst : IMyInterface<A>
{
    public T GetNewInstance<T>()
    {
        throw new NotImplementedException();
    }
}
从外部代码调用示例,如我问题的开头所示:

BFirst myBFirst = new BFirst();
A a = BFirst.GetNewInstance<A>(); //calls AFirst's method and returns A
B b = BFirst.GetNewInstance<B>(); //calls BFirst's method and returns B
BFirst myBFirst=new BFirst();
A=BFirst.GetNewInstance()//调用第一个方法并返回
B=BFirst.GetNewInstance()//调用BFirst的方法并返回B
这怎么可能? 谢谢
可以在泛型界面中定义泛型方法。我想这就是困惑所在。它应该是返回泛型类型的普通方法。即

interface IMyInterface<T> where T : A
{
    T GetNewInstance();
}
接口imy接口,其中T:A
{
T GetNewInstance();
}
这将作为

class AFirst : IMyInterface<A>
{
    public A GetNewInstance()
    {
        throw new NotImplementedException();
    }
}
class-affirst:IMyInterface
{
公开一个GetNewInstance()
{
抛出新的NotImplementedException();
}
}

我猜这就是你想要的。

你可能把事情复杂化了。你可以考虑。基类是抽象的,定义了一个可重写的方法。从这个基类继承的类提供了这个方法的实现

您仍然可以使用泛型和接口,但是这个模式可能是您需要从中开始的基础

编辑:

public abstract class ABase<T>
{
    public abstract T MyMethod();
}

public class A : ABase<A>
{
    public override A MyMethod()
    {
        throw new NotImplementedException();
    }
}

public class B : A
{
}
公共抽象类数据库
{
公共摘要myt method();
}
公开甲级:阿巴斯
{
公共重写MyMethod()
{
抛出新的NotImplementedException();
}
}
B级:A级
{
}
要实现一个接口,这将是

public interface IHasMethod<T>
{
    T MyMethod();
}

public abstract class ABase<T> : IHasMethod<T> ...
公共接口IHasMethod
{
T MyMethod();
}
公共抽象类数据库:IHasMethod。。。

标题没有误导性。。。“泛型接口”是我们都称之为带有泛型类型参数的接口:)谢谢,我只是想确定:)如果他需要接口怎么办?就像我建议的,他仍然可以使用接口。您仍然可以使用带有模板模式的接口。在这种情况下,它将与Tim建议的相同。我编辑了我的帖子来展示这一点。我真的不确定如何在我的情况下实现这一点。这将适用于A。但正如我所说,我也有BFirst,其中相同的方法应该返回B的一个实例。但是,从这个派生类B中,我还需要能够访问FirstA的GetNewInstance方法,它将返回A。不,我不会进行类型转换,我需要的正是我在示例中所述的内容。
public abstract class ABase<T>
{
    public abstract T MyMethod();
}

public class A : ABase<A>
{
    public override A MyMethod()
    {
        throw new NotImplementedException();
    }
}

public class B : A
{
}
public interface IHasMethod<T>
{
    T MyMethod();
}

public abstract class ABase<T> : IHasMethod<T> ...