0

状況:

私は iOS 開発 (C#) に Monotouch を使用しており、メイン クラスの 1 つは UIViewController です。そこから実装するiOSライブラリ(またはサードパーティ)には多くの既存のクラスがあり、UIViewControllerオブジェクトを返す多くの関数呼び出しもあります。

サブクラスで実装する必要がある抽象関数を作成し、「PageNumber パラメーターを持つ UIViewController」を返す必要があります。

私は次の抽象メソッド(私のメソッド)を持っています:

public abstract PageViewController GetPageViewController(int pageNumber);

と:

public class PageViewController: UIViewController{

        public int PageNumber = 0;
            ...

そのため、「PageNumber」パラメーターを持つ UIViewController を取得しています (まさに必要なもの)。UIViewController を作成するとき、「UIViewController」ではなく「PageViewController」から派生させます。

私の問題:

iOS には、UIViewController から派生した多くのサブクラスがあります。たとえば、UICollectionViewController です。

「UICollectionViewController」を使用したい場合、「UICollectionViewController」に追加機能が実装されていないため、「PageViewController」から派生させることはできません。

唯一の方法は、「PageViewController」を次のように変更することです。

public class PageViewController: UICollectionViewController{

ただし、UIViewController の別のサブクラスを渡す必要がある場合は、再びスタックします。

2 つのパラメーター (UIViewController と PageNumber) を保持するオブジェクトを作成することもできません。これは、UIViewController が iOS によって使用され、後で 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; }
}

UIViewController作成またはUICollectionViewController実装します。

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