设计多类型对象的最佳方法

2023-12-29

假设我有一个数据对象,但该对象可以保存多种类型的数据之一。

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.
&nbsp;
Foo foo = new Foo(0);
int iFoo = foo.Value; // succeeds
string sFoo = foo.Value; // compile error

也许这根本不可能……我必须做出一些妥协,但也许我错过了一些东西。

有任何想法吗?

EDIT:

好的,正如丹尼尔指出的那样,运行时类型的编译时检查是不切实际的。

在这里做我想做的事情的最佳选择是什么?也就是说,对待所有 Foo 都是一样的,但仍然有一个相对健全的访问机制?

EDIT2:

我不想将值转换为不同的类型。我想返回值的正确类型。也就是说,如果它是一个 double,我不想返回一个 int。


将变量作为参数传递给 get 怎么样?像这样:

int i = foo.get(i);

然后在你的课堂上,你会看到类似的内容:

public int get(int p) {
    if(this.type != INTEGER) throw new RuntimeException("Data type mismatch");
    return this.intVal;
}

public float get(float p) {
    if(this.type != FLOAT) throw new RuntimeException("Data type mismatch");
    return this.floatVal;
}

这种方式将类型检查从内到外转变:您不再检查 foo 所持有的类型,而是让 foo 检查您想要的类型。如果它可以给你该类型,它就会这样做,否则它会抛出运行时异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计多类型对象的最佳方法 的相关文章

随机推荐