2012-01-21 17 views
1

同じソースから異なる種類のフィールドを読み取ることができるシステムで、いくつかのDelphiコードをC#に移植します。私は、親クラスを使用し、すべてのフィールド型の内部および具体的なメカニズムを隠すために、子クラスにdoのすべての内部方法をカプセル化したいと思います。一般的な型を強い型付きの型として返します

が、私は「私の問題」である場所を示すために簡単な例を行っている:

また
using System; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ParentField<int> fieldInteger = new MyIntField<int>(); 
      fieldInteger.Value = 12; 

      ParentField<string> fieldString = new MyStringField<string>(); 
      fieldString.Value = "This is a String"; 

      Console.WriteLine("1. The Integer Value: " + fieldInteger.Value); 
      Console.WriteLine("1. The String Value: " + fieldString.Value); 

      int localInteger = fieldInteger.GetRealStrongTypedValue; 
      string localString = fieldString.GetRealStrongTypedValue; 

      Console.WriteLine("2. The Integer Value: " + localInteger); 
      Console.WriteLine("2. The String Value: " + localString); 
     } 
    } 







    public abstract class ParentField<T> 
    { 
     public abstract Object Value { get; set; } 
     public abstract T GetRealStrongTypedValue { get; } 
    } 

    public sealed class MyIntField<T> : ParentField<T> 
    { 
     public override Object Value 
     { 
      get { return valor; } 
      set { valor = (int)value; } 
     } 
     public override T GetRealStrongTypedValue 
     { 
      get { return valor; } // ERROR... 
     } 

     private int valor; 
    } 

    public sealed class MyStringField<T> : ParentField<T> 
    { 
     public override Object Value 
     { 
      get { return valor; } 
      set { valor = (string)value; } 
     } 
     public override T GetRealStrongTypedValue 
     { 
      get { return valor; } // ERROR... 

     } 

     private string valor; 
    } 
} 

私はこのように、子GetRealStrongTypedValueインスタンスメソッドからジェネリックを削除しようとしている:

public sealed class MyStringField<T> : ParentField<T> 
{ 
    public override Object Value 
    { 
     get { return valor; } 
     set { valor = (string)value; } 
    } 
    public new string GetRealStrongTypedValue 
    { 
     get { return valor; } 
    } 

    private string valor; 
} 

しかし、その後、私はParentFieldクラスの抽象メソッドを実装していません。

ParentField.GetRealStrongTypedValueをバーチャルに変更しようとしましたが、偽のコンテンツを実装しましたが、多態性はまったく実行されず、常に正確なParentField.GetRealStrongTypedValueを使用しています。

シンプルでスマートなアイデアですか? :-)

おかげで...

+0

「T」として保存しないのはなぜですか。 –

+0

そのため、毎回「コンシューマー」コードにキャストする必要があります。これは便宜上のものです。 – ferpega

答えて

2

私は何がやりたいことはMyStringFieldがジェネリックにするのではなく、それParentField<T>のタイプ固有の実装にしないと思います。

public sealed class MyStringField : ParentField<string> 
{ 
    public override Object Value 
    { 
     get { return valor; } 
     set { valor = (string)value; } 
    } 
    public override string GetRealStrongTypedValue 
    { 
     get { return valor; } // ERROR... 

    } 

    private string valor; 
} 
+0

あなたは私が自分よりも欲しいものを説明されています。ありがとうございます... :-) – ferpega

関連する問題