2017-12-12 20 views
1

派生クラスの具体的な型で置き換えられるように、PakFileFormatクラス内にジェネリックフィールドを宣言したいと思います。抽象クラス内でジェネリッククラスフィールドを宣言する方法

これは、罰金になります:

public class Pak10File : PakFileFormat 
{ 

    public Pak10File() 
    { 
     this.toc = new PakFileToc<Pak10FileEntry>(); 
    } 
} 

この問題を解決する方法は?おかげさまで あなたはまた、そのコンパイルを行うために、一般的なPakFileFormatを作成する必要があります

関連クラス

public abstract class PakFileEntry { } 

public class Pak10FileEntry : PakFileEntry 
{ 
    public long size;    // 8 bytes 
    public long csize;    // 8 bytes 
    public long offset;    // 8 bytes 
    public byte fname_len;   // 1 byte 
    public char[] fname;    // variable 
} 

public class PakFileToc<T> where T : PakFileEntry { } 


public abstract class PakFileFormat 
{  
    protected PakFileToc<T>; // ----- This does not compile. 
} 
+1

'保護PakFileTocを SomeActualFieldName;' –

+0

か、その 'toc'フィールドことになっていますか? 'PakFileToc 'への型パラメータについて気にしない、参照の意味での "汎用"フィールドを宣言したいと言っていますか?あなたはそれをすることはできません。これはC#のジェネリックではありません。コンパイル時に型パラメータを指定する必要があります。ジェネリックでない基底クラスを 'PakFileToc'に宣言して、そのクラスへの参照を使用することができます。可能であれば、実際のパラメーター化されたジェネリック型にキャストする必要がないように記述することをお勧めします。 –

+0

@EdPlunkettあなたはまったく正しいとは思いません。ジェネリックを使用する場合は、リストなどをIDEリストに表示し、宣言時に文字列タイプを指定します。私はこれを達成しようとしています。特に、PakFileTocには、PakFileEntry子を含むように制限します。 – ppk

答えて

1

これを有効にするには、PakFileFormatに何らかの種類の非汎用のインターフェイスを実装させる必要があります。

PakFileFormatが実際に行う必要があること、またはその使用方法を正確に知らなければ、これ以上の詳細を与えることは難しいです。

public abstract class PakFileFormat<TPakFile> where TPakFile : PakFileEntry 
{  
    protected PakFileToc<TPakFile> toc; 
} 

サブクラスは、その後のようなものになります。

public class Pak10File : PakFileFormat<Pak10FileEntry> 
{  
    public Pak10File() 
    { 
     this.toc = new PakFileToc<Pak10FileEntry>(); 
    } 
} 
+0

ありがとう!これは私が試していたものです。最も醜いが、問題を解決する。このアイデアは、さまざまなファイル形式を処理するクラスを作成することでした。このため、PakFileFormat、PakFileEntryは抽象型です。ちょうど空のコンテナ。実際の実装は特定のクラスにあります。 – ppk

関連する問題