C# 类通过泛型相互耦合

C# 类通过泛型相互耦合,c#,generics,types,nested-generics,C#,Generics,Types,Nested Generics,我目前正在学习C#,来自Java。在Java中,我可以执行以下操作: public interface BasePresenterView<T extends BaseActivityPresenter> {} public interface BaseActivityPresenter<T extends BasePresenterView> {} 公共接口BasePresenterView{} 公共接口BaseActivityPresenter{} 在C#中,我很

我目前正在学习C#,来自Java。在Java中,我可以执行以下操作:

public interface BasePresenterView<T extends BaseActivityPresenter> {}
public interface BaseActivityPresenter<T extends BasePresenterView> {}
公共接口BasePresenterView{}
公共接口BaseActivityPresenter{}

在C#中,我很难实现同样的目标。

这在.NET中被称为泛型约束

您在C#中的示例如下所示

public interface BasePresenterView<T> where T: 'Interface or Type'{}
public interface BaseActivityPresenter<T> where T: 'Interface or Type' {}
公共接口BasePresenterView,其中T:'接口或类型'{}
公共接口BaseActivityPresenter,其中T:'接口或类型'{}
更多信息


编辑:如前所述,循环依赖项在C#中是不可能的,因此不能像在示例中那样对它们进行约束。

这在.NET中称为泛型约束

您在C#中的示例如下所示

public interface BasePresenterView<T> where T: 'Interface or Type'{}
public interface BaseActivityPresenter<T> where T: 'Interface or Type' {}
公共接口BasePresenterView,其中T:'接口或类型'{}
公共接口BaseActivityPresenter,其中T:'接口或类型'{}
更多信息

编辑:正如前面提到的,循环依赖项在C#中是不可能的,因此您不能像在示例中那样约束它们。

您可以使用,它使用继承限制编译时类型

public interface BasePresenterView<T> where T : IBaseView
您可以使用,它使用继承限制编译时类型

public interface BasePresenterView<T> where T : IBaseView

如果您使用的是抽象基类,那么您需要这样的东西

public abstract class MyBasePresenter 
{
}
public abstract class MyBasePresenter<TView> : MyBasePresenter
    where TView : MyBaseView
{
}

public abstract class MyBaseView
{
}
public abstract class MyBaseView<TPresenter> : MyBaseView
    where TPresenter : MyBasePresenter
{
}

public class MyView : MyBaseView<MyPresenter>
{
}
public class MyPresenter : MyBasePresenter<MyView>
{
}
公共抽象类MyBasePresenter
{
}
公共抽象类MyBasePresenter:MyBasePresenter
何处TView:MyBaseView
{
}
公共抽象类MyBaseView
{
}
公共抽象类MyBaseView:MyBaseView
其中TPresenter:MyBasePresenter
{
}
公共类MyView:MyBaseView
{
}
公共类MyPresenter:MyBasePresenter
{
}
。。。如果您想要接口,请执行此操作

public interface IMyPresenter 
{
}
public interface IMyPresenter<TView> : IMyPresenter
    where TView : IMyView
{
}

public interface IMyView
{
}
public interface IMyView<TPresenter> : IMyView
    where TPresenter : IMyPresenter
{
}

public class MyView : IMyView<MyPresenter>
{
}    
public class MyPresenter : IMyPresenter<MyView>
{
}
公共接口IMyPresenter
{
}
公共接口IMyPresenter:IMyPresenter
TView:IMyView在哪里
{
}
公共界面IMyView
{
}
公共界面IMyView:IMyView
其中TPresenter:IMyPresenter
{
}
公共类MyView:IMyView
{
}    
公共类MyPresenter:IMyPresenter
{
}
。。。如果你真的想发疯,你甚至可以嵌套泛型

public class MyView : IMyView<IMyPresenter<IMyView>>
{
}
公共类MyView:IMyView
{
}

如果您使用的是抽象基类,那么您需要这样的东西

public abstract class MyBasePresenter 
{
}
public abstract class MyBasePresenter<TView> : MyBasePresenter
    where TView : MyBaseView
{
}

public abstract class MyBaseView
{
}
public abstract class MyBaseView<TPresenter> : MyBaseView
    where TPresenter : MyBasePresenter
{
}

public class MyView : MyBaseView<MyPresenter>
{
}
public class MyPresenter : MyBasePresenter<MyView>
{
}
公共抽象类MyBasePresenter
{
}
公共抽象类MyBasePresenter:MyBasePresenter
何处TView:MyBaseView
{
}
公共抽象类MyBaseView
{
}
公共抽象类MyBaseView:MyBaseView
其中TPresenter:MyBasePresenter
{
}
公共类MyView:MyBaseView
{
}
公共类MyPresenter:MyBasePresenter
{
}
。。。如果您想要接口,请执行此操作

public interface IMyPresenter 
{
}
public interface IMyPresenter<TView> : IMyPresenter
    where TView : IMyView
{
}

public interface IMyView
{
}
public interface IMyView<TPresenter> : IMyView
    where TPresenter : IMyPresenter
{
}

public class MyView : IMyView<MyPresenter>
{
}    
public class MyPresenter : IMyPresenter<MyView>
{
}
公共接口IMyPresenter
{
}
公共接口IMyPresenter:IMyPresenter
TView:IMyView在哪里
{
}
公共界面IMyView
{
}
公共界面IMyView:IMyView
其中TPresenter:IMyPresenter
{
}
公共类MyView:IMyView
{
}    
公共类MyPresenter:IMyPresenter
{
}
。。。如果你真的想发疯,你甚至可以嵌套泛型

public class MyView : IMyView<IMyPresenter<IMyView>>
{
}
公共类MyView:IMyView
{
}
我想我已经解决了:)

公共接口BaseActivityPresenter
其中T:BasePresenterView
其中K:BaseActivityPresenter{}
公共接口BasePresenterView
其中T:BasePresenterView
其中K:BaseActivityPresenter{}
这似乎奏效了。。。现在。我不知道这是否是一个正确的方法。

我想我已经解决了:)

公共接口BaseActivityPresenter
其中T:BasePresenterView
其中K:BaseActivityPresenter{}
公共接口BasePresenterView
其中T:BasePresenterView
其中K:BaseActivityPresenter{}

这似乎奏效了。。。现在。我不知道这是否是一种正确的方法。

您具有循环依赖关系:BasePresenterView对于参数BaseActivityPresenter是泛型的,BaseActivityPresenter对于参数BasePresenterView是泛型的。我不认为这是真的有可能的Ejez,刚学这门语言的几个小时,我就已经把头撞到墙上了。不好:/Net中的惯例是所有接口都使用前缀大写字母
I
,并且大多数情况下为抽象类保留单词
Base
。您具有循环依赖关系:BasePresenterView与参数BaseActivityPresenter是泛型的,BaseActivityPresenter与参数BasePresenterView是泛型的。我不认为这是真的有可能的Ejez,刚学这门语言的几个小时,我就已经把头撞到墙上了。不好:/Net中的惯例是所有接口都使用前缀大写字母
I
,并且大多数情况下为抽象类保留单词
Base
。。。我建议你做
而不是
@matthewhited是的,这是一个明智的建议,我会这么做。谢谢:)虽然没什么关系。。。我建议你做
而不是
@matthewhited是的,这是一个明智的建议,我会这么做。谢谢:)