Kotlinであるクラスのメソッドの呼び出しをコンパイル時エラーとして防ぎたい


Kotlinで、あるインターフェースに関するいくつかの実装クラスのうちの一つのクラスだけ特定メソッドを呼び出したくないため、コンパイル時エラーとすることで使用を防ぎたいです。  
具体的には、次のようなインターフェースとクラス定義があったとします。

[code]

    interface IHoge{
      fun test()
    }
    class A: IHoge
    class B: IHoge
    class C: IHoge
    
[/code]

とあったときに`C.test()`は呼び出したくないとします。つまりここの状況下で`C.test()`と記述したらコンパイルエラーとなるようにしたいのですが、そのような方法はあるのでしょうか？

メソッドを

[code]

    fun test(){
      error()
    }
    
[/code]

などとすることによって実行時エラーを起こすことは簡単です。しかし、コンパイル時に`C.test()`を呼ぶことを防ぐ手段はあるのでしょうか？javaの例でも構いません。




`C.test()`を呼び出したくないのですから、そもそも`C`は`IHoge`を実装すべきではありません。以下`IHoge`の実装に手を出せる場合と、そうでない場合について回答してみます。

### 1.IHogeの実装を変更できる場合

この場合はインターフェースを分離するのが適当だと思います。

[code]

    interface IHoge {
      fun test()
    }
    
    interface IFuga {
      // 元のIHogeのtest()以外のメソッド
    }
    
    class A: IHoge, IFuga
    class B: IHoge, IFuga
    class C: IFuga
    
    
[/code]

### 2.IHogeの実装を変更できない場合

こちらの場合はインターフェースのデフォルト実装を使いたいという要求がありうるので、`test()`以外のメソッドを持つ`IPartial`を定義し、新しいクラス`D`で`IHoge`と`IPartial`を「マージ」するようにしています。  
さらに`C`に`D`を直接継承させず、[デリゲート](https://kotlinlang.org/docs/reference/delegation.html)することで、`IHoge`のサブクラスにならないようにしています。

[code]

    interface IHoge {
        fun f() = println("f()")
        fun test() = println("test()")
    }
    
    interface IPartial {
        fun f();
    }
    
    open class D : IHoge, IPartial {
        override fun f() = super<IHoge>.f();
    }
    
    class A : D()
    class B : D()
    
    class C(p: IPartial = D()) : IPartial by p {
    }
    
    fun main() {
        val l1 = mutableListOf<IHoge>(A(), B())
        // l1.add(C(A())) // <--- コンパイル時エラー
        l1.forEach { it.test() }
    
        val l2 = mutableListOf<IPartial>(A(), B(), C());
        l2.forEach { it.f() }
    }
    
[/code]

[code]

    test()
    test()
    f()
    f()
    f()
    
[/code]

