1

我目前正在学习 C#,我来自 Java。在 Java 中,我可以这样做:

public interface BasePresenterView<T extends BaseActivityPresenter> {}
public interface BaseActivityPresenter<T extends BasePresenterView> {}

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

4

4 回答 4

0

您可以使用泛型类型约束,它使用继承来限制编译时类型。

public interface BasePresenterView<T> where T : IBaseView

因为继承不能是循环的,所以你不能像问题中那样具有循环依赖。

但是,如果它们声明相同的方法或属性,它们可以继承相同的接口:

public interface BasePresenterView     : IBaseView
public interface BaseActivityPresenter : IBaseView
于 2017-01-26T15:59:38.420 回答
0

如果您使用抽象基类,您想要这样的东西......

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>
{
}

...如果您需要接口,请执行此操作...

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>
{
}

...你们中的一些人真的很想发疯,甚至可以嵌套泛型...

public class MyView : IMyView<IMyPresenter<IMyView>>
{
}
于 2017-01-26T16:11:45.823 回答
0

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

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

public interface BasePresenterView<T> where T: 'Interface or Type'{}
public interface BaseActivityPresenter<T> where T: 'Interface or Type' {}

更多信息https ://msdn.microsoft.com/en-us/library/d5x73970.aspx

编辑:正如已经提到的循环依赖在 C# 中是不可能的,所以你不能像在你的例子中那样约束它们。

于 2017-01-26T15:57:46.680 回答
0

我想我解决了:)

public interface BaseActivityPresenter<T, K> 
        where T : BasePresenterView<T, K>
        where K : BaseActivityPresenter<T, K> {}

public interface BasePresenterView<T, K> 
        where T : BasePresenterView<T, K>
        where K : BaseActivityPresenter<T, K> {}

这似乎正在工作......现在。我不知道这是否是正确的方法。

于 2017-01-26T18:50:09.807 回答