假设我有一个数据对象,但这个对象可以保存几种类型的数据之一。
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<T>。每个都有不同的类型,所以我不能真正将它们用作相同的类型。
我可以从 FooBase 派生 Foo<T>,然后将它们全部视为 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
也许这甚至是不可能的......我必须做出一些妥协,但也许我错过了一些东西。
有任何想法吗?
编辑:
好的,正如丹尼尔指出的那样,运行时类型的编译时检查是不切实际的。
在这里做我想做的事情的最佳选择是什么?即,对所有 Foo 都一视同仁,但仍然有一个相对健全的访问机制?
编辑2:
我不想将值转换为不同的类型。我想为该值返回正确的类型。也就是说,如果它是双精度的,我不想返回一个 int。