2

假设我有以下课程:

public class Gender
{
    public readonly string Name { get; set;}
    public readonly char Abbreviation { get; set;} 
    public readonly string ChildName { get; set;}
    public readonly int Number { get; set;}

    public static Gender Male = new Gender { Name = "Male", Abbreviation = 'M', Number = 1, ChildName = "Boy" };
    public static Gender Female = new Gender { Name = "Female", Abbreviation = 'F', Number = 2, ChildName = "Girl" };
    public static Gender Unknown = new Gender { Name = "Unknown", Abbreviation = 'U', Number = 0, ChildName = "Unknown" };
}

除了通过任何其他方式实例化 Gender 类之外,我怎样才能使其非法

Gender MyGender = Gender.Male

从而使

Gender Spaghetti = new Gender{Name = "Spaghetti", Abbreviation = 'S', Number = 123, ChildName = "Angel Hair" }

在编译时抛出错误?

4

3 回答 3

8

private构造函数添加到Gender类:

public class Gender
{
    public readonly string Name { get; set;}
    public readonly char Abbreviation { get; set;} 
    public readonly string ChildName { get; set;}
    public readonly int Number { get; set;}

    private Gender()
    {
    }

    public static Gender Male = new Gender { Name = "Male", Abbreviation = 'M', Number = 1, ChildName = "Boy" };
    public static Gender Female = new Gender { Name = "Female", Abbreviation = 'F', Number = 2, ChildName = "Girl" };
    public static Gender Unknown = new Gender { Name = "Unknown", Abbreviation = 'U', Number = 0, ChildName = "Unknown" };
}

您也可以添加readonlyMale//声明FemaleUnknown以使以下代码不可能:

Gender.Male = Gender.Female;
于 2013-09-17T17:29:52.850 回答
5

给它一个私有构造函数:

public class Gender
{
    // ...

    private Gender() {  }
}

通常,如果没有定义构造函数,那么编译器会创建一个没有参数的“默认构造函数”。但是,如果您定义一个,则没有默认值。如果那个是私有的,那么该类之外的任何东西都不能调用它。所以没有什么可以建立一个Gender除了Gender自身之外的实例。

于 2013-09-17T17:30:30.227 回答
1

将构造函数设为私有。这就是它在 SingleTon 模式中的使用方式。

于 2013-09-17T17:30:42.240 回答