0

通常のインターフェース:

public interface IComputation
{
    void Reset();
    float GetValue1();
    float GetValue2();  
}

汎用インターフェース:

public interface IComputation<T> : IComputation where T : IComputation
{
    T Proxy { get; set; }
}

クラスについては次のとおりです。

public abstract class Computation<T> : IComputation<T> where T : IComputation
{
    public T Proxy { get; set; }    
}

クラス「ComputationCache」は「装飾された」計算です:

internal abstract class ComputationCache<T> : IComputation where T : IComputation
{
    public T Proxy { get; set; }    

    public float GetValue1()
    {
        bool isCached = //check cache.
        if(!isCached)
        {
            //compute value
            float value1 = Proxy.GetValue1();                           

            //update cache

            return value;
        }       
    }
}

装飾された計算を初期化するために、次のことを試しました。

public ComputationCache(IComputation<T> proxy)
{
    Proxy = (T) proxy;
    proxy.Proxy = this;
}

...次のエラーが発生します":

ソース タイプ 'ComputationCache' をターゲット タイプ 'T' に変換できません。

誰かが使用する方が良いかどうかについてコメントできますか:

ComputationCache<T> : IComputation where T : IComputation

ComputationCache<T> : IComputation<T> where T : IComputation
4

1 に答える 1

0

まず、次を使用する必要があります。

ComputationCache<T> : IComputation<T> where T : IComputation

IComputation<T>キャッシュを として使用し、そのProxyプロパティにアクセスしたい場合。

第二に、あなたのエラーのために:

ソース タイプ 'ComputationCache' をターゲット タイプ 'T' に変換できません。

これを行うだけです:

proxy.Proxy = (T)(IComputation)this;

(なぜこのエラーが発生するのかわかりません。ComputationCache は T のような IComputation であるため...)


編集:まあ、私は自分の解決策を間違っているものを見つけました:

new ComputationCache<Computation<IComputation>>(new Computation<Computation<IComputation>>());

この投稿は、ジェネリックの分散に関するこのエラーを見つけるのに役立ちました

TComputation<IComputation>と等しくなくなりComputationCacheます。

Proxyあなたが書いたようにあなたの財産を働かせるには、おそらくいくつかの問題があるでしょう。

あなたはそのようなことをしたいかもしれません:

public interface IComputation
{
    IComputation Proxy { get; set; }
    // Other stuff
}

public interface IComputation<T> : IComputation where T : IComputation
{
    new T Proxy { get; set; }
    // Other stuff
}

ただし、2 つのプロパティを管理する必要がありますProxy

あなたが何を達成しようとしているのかはわかりませんが、それは始まりです。

于 2016-08-10T13:11:50.840 に答える