web-dev-qa-db-ja.com

クラス内の2つのインターフェースの実装からメソッドにアクセスする

キャッシュレイヤーに次のパターンを実装しようとしています。

getUsers() in serCache Class、getLikes() in PostsCache classなどの可能なキャッシュメソッドの実装を分割しています。

しかし、私はこれらすべてのメソッドにCache.getUsers()Cache.getLikes()などの単一クラスオブジェクトからアクセスできるようにしたい

この背後にある理由は、このレイヤーを使用している開発者が、このレイヤーの背後で行われた分割を認識しないようにしたいからです。

私は次のことをしました

2インターフェース-UserCache, PostsCacheおよびインターフェースを実装する2つのクラス-UserCacheImpl, PostsCacheImpl

これら2つのインターフェイスを実装する抽象クラ​​ス AbstractCacheを導入しようとしたところ、このCacheクラスがその抽象クラスを拡張します。しかし、それは失敗しました:(

これらの2つを1つのCacheオブジェクトからアクセスできるようにするにはどうすればよいでしょうか。案内してください

6
Magesh Kumaar

あなたが持っていることは完全に可能です

これら2つのインターフェースを実装するa [n]抽象クラスAbstractCacheは、このCacheクラスがその抽象クラスを拡張します。

public interface UserCache {
    int getUsers();
}

public interface PostsCache {
    int getLikes();
}

public abstract class AbstractCache implements UserCache, PostsCache {
    @Override public int getUsers() { return 12; }
    @Override public int getLikes() { return 34; }
}

public class Cache extends AbstractCache {
}

そして、すべてが完璧にコンパイルされます。もちろん、Javaで実行できないことは、1つのクラスが2つのクラスを拡張する多重継承を持つことです) (2つのインターフェースを実装するのとは対照的に)、そうすることはできません

public abstract class AbstractCache extends UserCacheImpl, PostsCacheImpl {
}

これがあなたが実際にやろうとしていることだと思います。ここでの解決策は継承よりも構成を優先すること

public abstract class AbstractCache implements UserCache, PostsCache {
    private UserCacheImpl userCache;
    private PostsCacheImpl postsCache;

    public AbstractCache() {
        userCache = new UserCacheImpl();
        postsCache = new PostsCacheImpl();
    }

    @Override public int getUsers() { return userCache.getUsers(); }
    @Override public int getLikes() { return postsCache.getLikes(); }
}
13
Philip Kendall