0

情况:

我正在使用 Monotouch 进​​行 iOS 开发 (C#),其中一个主要类是 UIViewController。iOS 库(或第三方)中有很多现有的类可以从中实现,并且还有很多函数调用返回 UIViewController 对象。

我现在创建了一个应该在子类中实现的抽象函数,它必须返回一个 "UIViewController with a PageNumber parameter"

我有以下抽象方法(我的方法):

public abstract PageViewController GetPageViewController(int pageNumber);

和:

public class PageViewController: UIViewController{

        public int PageNumber = 0;
            ...

所以我得到了一个 UIViewController,它有一个“PageNumber”参数(正是我需要的)。创建 UIViewController 时,我从“PageViewController”而不是“UIViewController”派生。

我的问题:

iOS 有很多从 UIViewController 派生的子类。例如,UICollectionViewController。

如果我想使用“UICollectionViewController”,我不能从“PageViewController”派生,因为它没有在“UICollectionViewController”中实现的附加功能。

唯一的方法是将“PageViewController”更改为

public class PageViewController: UICollectionViewController{

但是,如果我需要传递 UIViewController 的另一个子类,我又被卡住了。

创建一个包含两个参数(一个 UIViewController 和一个 PageNumber)的对象也是不可能的,因为 iOS 将使用 UIViewController 并且我需要能够在稍后从 iOS 获取 UIViewController 对象时检索页码。

以我目前的知识拥有“东西”的唯一方法是:

1) 改变

public abstract PageViewController GetPageViewController(int pageNumber);

public abstract UIViewController GetPageViewController(int pageNumber);

这将确保您可以传递“任何” UIViewController(包括所有子类)

2)定义一个带参数PageNumber的接口(例如IPageNumber)

3) 你应该传递一个 UIViewController 的文档,它也实现了这个额外的接口

4)当UIViewController在某个点返回时,检查它是否也是一个“IPageNumber”。如果不是,则抛出错误。

当然,这将在运行时而不是在编译时引发错误。

有谁知道这个问题是否有更好的解决方案?

PS:我是一个没有经验的爱好开发者,如果我的一些术语不正确,请道歉。我也搜索过,但找不到任何东西(也是因为我不知道要搜索的好关键字)

4

1 回答 1

2

为什么不直接使用接口呢?喜欢:

public interface IPageViewController
{
    int PageNumber { get; }
}

制作UIViewControllerUICollectionViewController实施它:

public class PageViewController: UIViewController, IPageViewController
{
    public int PageNumber { get; private set; }
    ...
}
于 2013-10-18T17:12:16.463 回答