假设我有一个数据对象,但该对象可以保存多种类型的数据之一。
class Foo
{
int intFoo;
double doubleFoo;
string stringFoo;
}
现在,我想创建一个访问器。获取这些数据的某种方法。显然,我可以创建多个访问器:
public int GetIntFoo();
public double GetDoubleFoo();
public string GetStringFoo();
或者我可以创建多个属性
public int IntFoo { get; set; }
public double DoubleFoo { get; set; }
public string StringFoo { get; set; }
我不认为这是一个非常好的设计。它要求客户端代码比应有的更加关心类型。更重要的是,我实际上只需要此类的单个值,并且上面的内容将允许同时分配每种类型之一。不好。
一种选择是使用泛型。
class Foo<T>
{
public T TheFoo { get; set; }
}
但是,这不会创建 Foo,而是创建 Foo。每个都有不同的类型,所以我不能真正将它们用作相同的类型。
我可以从 FooBase 派生 Foo,然后将它们全部视为 FooBase,但随后我又回到了访问数据的问题。
一个不同的泛型选项是使用类似这样的东西:
class Foo
{
string stringRepresentationOfFoo;
public T GetFoo<T>() { return /* code to convert string to type */ }
}
当然,问题是任何类型的T都可以通过,坦白说,有点忙。
我也可以只装箱值并返回一个对象,但这样就没有类型安全了。
理想情况下,我想对所有 Foo 进行相同的处理,但我想要类型安全,这样如果没有 StringFoo,我什至无法编译对 StringFoo 的引用。
Foo foo = new Foo("Foo");
string sFoo = foo.Value; // succeeds.
Foo foo = new Foo(0);
int iFoo = foo.Value; // succeeds
string sFoo = foo.Value; // compile error
也许这根本不可能……我必须做出一些妥协,但也许我错过了一些东西。
有任何想法吗?
EDIT:
好的,正如丹尼尔指出的那样,运行时类型的编译时检查是不切实际的。
在这里做我想做的事情的最佳选择是什么?也就是说,对待所有 Foo 都是一样的,但仍然有一个相对健全的访问机制?
EDIT2:
我不想将值转换为不同的类型。我想返回值的正确类型。也就是说,如果它是一个 double,我不想返回一个 int。