我正在将一些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
实例方法中删除Generic:
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
Class实现抽象方法。
我曾尝试将ParentField.GetRealStrongTypedValue
更改为虚拟,实现虚假内容,但多态性根本不会运行,并始终使用精确的ParentField.GetRealStrongTypedValue
,因此它会返回虚假内容。
任何简单明智的想法? : - )
...谢谢
答案 0 :(得分: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;
}