类 通过泛型相互耦合
Classes coupled with each other by generics
我目前正在学习 C#,我来自 Java。在 Java 中,我可以这样做:
public interface BasePresenterView<T extends BaseActivityPresenter> {}
public interface BaseActivityPresenter<T extends BasePresenterView> {}
而在 C# 中,我很难实现同样的目标。
这在 .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# 中是不可能的,因此您不能像示例中那样限制它们。
您可以使用 generic type constraints,它使用继承限制 compile-time 类型。
public interface BasePresenterView<T> where T : IBaseView
因为继承不能是循环的,所以不能有问题中的循环依赖。
但是,如果它们声明相同的方法或属性,则它们可以继承相同的接口:
public interface BasePresenterView : IBaseView
public interface BaseActivityPresenter : 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>
{
}
...如果您需要接口,请执行此操作...
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>>
{
}
我想我已经解决了:)
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> {}
这似乎有效...目前。我不知道这是否是一个正确的方法。
我目前正在学习 C#,我来自 Java。在 Java 中,我可以这样做:
public interface BasePresenterView<T extends BaseActivityPresenter> {}
public interface BaseActivityPresenter<T extends BasePresenterView> {}
而在 C# 中,我很难实现同样的目标。
这在 .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# 中是不可能的,因此您不能像示例中那样限制它们。
您可以使用 generic type constraints,它使用继承限制 compile-time 类型。
public interface BasePresenterView<T> where T : IBaseView
因为继承不能是循环的,所以不能有问题中的循环依赖。
但是,如果它们声明相同的方法或属性,则它们可以继承相同的接口:
public interface BasePresenterView : IBaseView
public interface BaseActivityPresenter : 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>
{
}
...如果您需要接口,请执行此操作...
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>>
{
}
我想我已经解决了:)
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> {}
这似乎有效...目前。我不知道这是否是一个正确的方法。