课堂创作设计。需要一些帮助

时间:2010-07-04 11:35:51

标签: c#

我有一些代码:

public class class1
{
    public class1(int count)
    {
         // count must be 4,6,8
    }
}

该类'class1'是我写的SDk库中的公共类。 Count变量对于class1非常重要。它必须是4,6,8。

我想确保程序员(使用我的SDK)无法使用无效的'count'参数创建class1的实例。

我该怎么办?你建议我做什么?

在这里使用枚举是否合适?

4 个答案:

答案 0 :(得分:2)

枚举适用于发现但不会帮助您进行验证 - 您仍然可以传入不正确的值。

new class1(FooCount.Four);  // Using an enum allows you to write this.
new class1((FooCount)5);    // But you can also do this.

要验证值(无论您是否选择使用枚举),请根据允许值列表检查值,如果值为无效值,则引发ArgumentException

答案 1 :(得分:1)

如果您不想使用例外,则始终存在工厂模式。 您请求具有特定参数的Class1,Factory验证它并在验证失败时返回空对象。

可能还有其他更好的解决方案。在我的脑海中,有3种类型的派生类:ClassCount4,ClassCount5等可能是一个解决方案。

您能否提供一些有关Count为特定值的重要性的更多信息?

编辑:

您可以尝试这样的事情:

class Class1
{
    private int _count;

    Class1(int Count)
    {
        _count = Count;
    }

    public static Class1 Instance (int Count)
    {
        if (ValidParam(Count))
            return new Class1(Count);
        return null;
    }

    private static bool ValidParam(int Count)
    {
        if ( Count == 4 || Count == 6 || Count == 8 )
            return true;
        return false;
    }
}

答案 2 :(得分:0)

如何抽象class1并为每个计数创建具体实现。使类1构造函数受到保护,您将受到保护。只是一个想法。

答案 3 :(得分:0)

为什么不创建具有公共基类的三个类,而不是让class1接受变量计数?

public abstract class Class1Base
{
    protected class1(int count) { }
}

public class Class1Count4
{
    public Class1Count4()
        : base(4)
    { }
}

// also have implementations for the other eligible values for count.

如果您的算法实际上根据计数而变化(即计数的单独用法之间没有公共代码),那么您可以改为使用接口:

public interface IClass1
{
    // Interface methods
}

public class CountImpl4 : IClass1
{
    // Implement IClass1 with count being 4.
}

// Other implementations.

使用这些设计中的任何一个,您都可以将无效的用户输入排除在等式之外。另外,如果您需要更改一个实现的工作方式,需要支持其他计数值等,您可以使用另一个类扩展Class1Base /实现IClass1。

修改

由于您希望将其保留在一个类中,为什么不定义要传入的Type-Safe枚举?

public struct CountEnum
{
    public readonly int Count;

    public static readonly CountEnum Four = new CountEnum(4);
    public static readonly CountEnum Six = new CountEnum(6);
    public static readonly CountEnum Eight = new CountEnum(8);

    private CountEnum(int count)
    {
        Count = count;
    }
}

public class Class1
{
    public Class1(CountEnum countEnum)
    { 
        // Access the value via countEnum.Count.
    }
}

由于CountEnum只有一个私有构造函数,因此唯一可用的实例是静态定义的Four,Six和Eight。用户现在只能输入四,六或八。由于CountEnum是一个struct,因此null也不可用。