同じソースから異なる種類のフィールドを読み取ることができるシステムで、いくつかの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
を使用しています。
シンプルでスマートなアイデアですか? :-)
おかげで...
「T」として保存しないのはなぜですか。 –
そのため、毎回「コンシューマー」コードにキャストする必要があります。これは便宜上のものです。 – ferpega