【发布时间】:2010-02-22 13:03:37
【问题描述】:
我正在将一个 http GET 查询字符串解析为其组件。在尝试使其模块化(参数的数量和类型可能会有很大差异)时,我想要一个 Parameter 抽象基类或接口来定义是否已设置属性,以及设置属性的 Set 方法价值。有没有办法使用 Set 方法的可变参数类型来做到这一点?
大致思路如下:
public abstract class Parameter
{
public bool IsSet { get; protected set; }
protected Parameter() { IsSet = false; }
public abstract void Set( --unknown type here-- );
}
示例参数 child 将类似于:
public class IntParameter : Parameter
{
public int Value { get; protected set; }
public void Set(int value)
{
Value = value;
IsSet = true;
}
}
使用这种结构,我可以将每个查询参数扔到其适当的强类型类中,但仍要确保所有参数的行为一致。 IsSet 属性的原因是能够检查参数是否已设置,因为某些参数没有任何“安全”值,我肯定知道这些值不是有意传递的。如果没有设置一个值,那么它将获得一个默认值。
看着这个问题,我怀疑它是否可以按照我想要实现的方式处理,但是这个例子应该让我明白我想要做什么。
对于如何最好地处理它有什么建议吗?如果有一种方便的设计模式或通用的方法,我不会感到惊讶,但我还没有设法谷歌。
我看到的选项是:
- 不要使用继承,而是依靠约定来保持一致性。我很可能不需要通过列表迭代等来处理这些,但如果我找到了一种方法,它可能会带来一些新的想法或机会。
- 使用对象参数,然后执行一些 typeof() 并以某种方式切换魔法,尽管这让我觉得非常丑陋,可以说是非多态的。
还有其他想法吗? :)
【问题讨论】:
-
是的,我应该意识到这一点。没有马上注意到你的评论。下面的答案已经很清楚了。 :)
标签: c# inheritance interface abstract-class