C#ジェネリックでは、「このタイプ」が役立つ場合があります

コードを解析すると、明らかにクリーンアップが必要な場所が見つかりました。 しかし、それをクリーンアップするには、言語に機能が必要になるので、これについて説明します。 StackOverflowでもこの質問を提起しました。 評判の良い同志に支えられました。

2つのクラスを使用し、一方は他方から継承します。 基本クラスはジェネリックです。派生クラスには、このプライベート型のインスタンスを返す必要があるメソッドがあります。

たとえば、次のようにします(本文中の???に注意してください):

public class Adapter<T>
{
public virtual ??? DoSomething()
{
...
}
}

public class AdaptedString : Adapter< String >
{
public override AdaptedString DoSomething()
{
...
}
}


* This source code was highlighted with Source Code Highlighter .


ジェネリックを「閉じる」ことによって取得された型を参照する方法がないため、これは実行できません。 このメソッドが派生プライベートクラスのインスタンスを返すことを示す「???」を置き換えることができるキーワードはありません。

代わりに、回避策のみが残ります。 型を基本クラスに明示的に渡す必要があります。 それは明らかに冗長であることが判明しました:

public class Adapter<TThis,T>
{
public virtual TThis DoSomething()
{
...
}
}

public class AdaptedString : Adapter< AdaptedString , String >
{
public override AdaptedString DoSomething()
{
...
}
}


* This source code was highlighted with Source Code Highlighter .


基本クラスでTThis型のインスタンスメソッドにアクセスする必要がある場合は、constを追加する必要があります。 そして、それはかなり怖いことが判明しました:

public class Adapter<TThis,T>
where TThis : Adapter<TThis, T>
{
protected int _field;
...
public bool Compare( TThis obj )
{
return _field == obj._field;
}
}

public class AdaptedString : Adapter< AdaptedString , String >
{
...
}


* This source code was highlighted with Source Code Highlighter .


基本的には動作します。 しかし、それは非常にわかりにくいように見えます。 このコードを見るたびに混乱し、誰が誰であるかを理解するのに時間がかかります。

「TThis」をこのタイプにする必要があると何らかの形で示すことができれば、はるかに便利に思えます。 何らかの種類のキーワードを使用している可能性があります。 「thistype」と似ていますが、恐ろしく見えます。 以下を入力するのは一定です。
TThis:このタイプ

そして、この地区パスを使用すると、簡単に混乱することがわかります:

class TypeA : Adapter<TypeA, string >

class TypeB : Adapter<TypeA, string > // Bug!


* This source code was highlighted with Source Code Highlighter .

Source: https://habr.com/ru/post/J69813/


All Articles