Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 班级创作设计。需要帮忙吗_C# - Fatal编程技术网

C# 班级创作设计。需要帮忙吗

C# 班级创作设计。需要帮忙吗,c#,C#,我有一些代码: public class class1 { public class1(int count) { // count must be 4,6,8 } } 该类“class1”是我编写的SDk库中的一个公共类。计数变量是一个非常重要的类。它必须是4,6,8 我想确保程序员(使用我的SDK)不能创建带有无效“count”参数的class1实例 我该怎么办?你建议我做什么 在这里使用枚举好吗 枚举有助于发现,但不会帮助您进行验证-您仍然可以传递

我有一些代码:

public class class1
{
    public class1(int count)
    {
         // count must be 4,6,8
    }
}
该类“class1”是我编写的SDk库中的一个公共类。计数变量是一个非常重要的类。它必须是4,6,8

我想确保程序员(使用我的SDK)不能创建带有无效“count”参数的class1实例

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


在这里使用枚举好吗

枚举有助于发现,但不会帮助您进行验证-您仍然可以传递不正确的值

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

要验证该值(无论您是否选择使用枚举),请对照允许值列表检查该值,如果该值无效,则引发错误。

如何抽象class1并为每个计数创建具体实现。让class1构造函数被移植,你就会受到保护。只是个主意

如果不想使用异常,则始终存在工厂模式。 您请求带有特定参数的Class1,工厂将对其进行验证,如果验证失败,则返回一个空对象

可能还有其他更好的解决方案不是那么通用。在我看来,拥有3种类型的派生类:ClassCount4、ClassCount5等可能是一个解决方案

你能提供一些关于为什么计数是一个特定值很重要的更多信息吗

编辑:

您可以尝试以下方法:

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;
    }
}

与其让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.
如果您的算法实际上根据count是什么而改变(即count的不同用法之间没有通用代码),那么您可以使用接口来代替:

public interface IClass1
{
    // Interface methods
}

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

// Other implementations.
使用这两种设计中的任何一种,您都可以排除用户输入无效的可能性。另外,如果您需要更改一个实现的工作方式,需要支持其他计数值,等等。您可以使用另一个类扩展ClassBase/实现IClass1

编辑 既然您希望将其保存在一个类中,为什么不定义要传入的类型安全枚举呢

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只有一个私有构造函数,所以唯一可用的实例是静态定义的四、六和八。用户现在只能输入四、六或八。因为CountEnum是一个结构,null也不可用。

虽然如果4、6和8有具体的值,这意味着什么,枚举可能不是最糟糕的主意,但它不会保护您免受任何影响……我考虑了argumentexception。但也许有更好的设计-例如一些图案@戴夫,你可以用计数作弊…@Alexander Dronov:你可以研究代码契约:@andreit,计数是游戏场的大小。4x4、6x6、8x8。class1的所有其他方法和属性都依赖于(?)它。我考虑了这个实现。但这将导致SDK-->大SDK-->中的几个公共类不是很好的解决方案。“我正试图找到另一种解决方案。”S.DePouw,我考虑过这个实现。但这将导致SDK-->大SDK-->中的几个公共类不是很好的解决方案。我正试图找到另一种解决办法。