dis*_*nte 2 c# class-design class
我在理解如何正确封装我的课时遇到问题.它是(或应该是)一个不可改变的类.
我正在使用"帮助类",我希望它不能从外部访问.
namespace MyApp
{
[Flags]
public enum OctaveGroups
{
None = 0,
oneOctave = 1
}
class Frequencies
{
// HelperClass
public class Frequency
{
public string Name { get; set; }
public OctaveGroups Octave { get; set; }
}
public readonly static List<Frequency> All = new List<Frequency>
{
#region Complete Frequencies Data
new Frequency { Name = "63", Hz = 63,
Octave = OctaveGroups.oneOctave | OctaveGroups.None,
},
new Frequency { Name = "80", Hz = 80,
Octave = OctaveGroups.None,
}
// And so on..
//..
#endregion
};
public readonly List<Frequency> OneOctave = All.Where(f => f.Octave.HasFlag(OctaveGroups.oneOctave)).ToList();
public readonly List<Frequency> None = All.Where(f => f.Octave.HasFlag(OctaveGroups.None)).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我Frequency上课protected或private我收到此错误:
可访问性不一致:字段类型"列表"比字段'Frequencies.All'更难访问
如果我制作class Frequency并List<Frequency> All保护并尝试创建一个返回List<Frequency>类似的方法,我会得到相同的错误:
public List<Frequency> GetAll()
{
return All.Where(f => f.Octave.HasFlag(OctaveGroups.OneOctave)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
在保持只读.All .OneOctave和.None字段的同时公开just 和fields 的正确方法怎么样?
Frequency当您计划返回公共方法时,您不能指望隐藏List<Frequency>.
现在,我的理解是你的问题是,你需要访问的属性setter Frequency从Frequencies,但你不希望他们暴露于外部.这样做的方法是通过一个只暴露getter的接口:
public interface IFrequency
{
string Name { get; }
OctaveGroups Octave { get; }
}
Run Code Online (Sandbox Code Playgroud)
现在,您创建Frequencies.Frequency了一个私有嵌套类,并且只公开IFrequency:
class Frequencies
{
// HelperClass
private class Frequency: IFrequency
{
public string Name { get; set; }
public OctaveGroups Octave { get; set; }
}
public readonly static List<IFrequency> All = new List<IFrequency>
{
#region Complete Frequencies Data
new Frequency { Name = "63", Hz = 63,
Octave = OctaveGroups.oneOctave | OctaveGroups.None,
},
new Frequency { Name = "80", Hz = 80,
Octave = OctaveGroups.None,
}
// And so on..
//..
#endregion
};
public readonly List<IFrequency> OneOctave = All.Where(f => f.Octave.HasFlag(OctaveGroups.oneOctave)).ToList();
public readonly List<IFrequency> None = All.Where(f => f.Octave.HasFlag(OctaveGroups.None)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
现在,消费者Frequencies只会看到IFrequency没有暴露的情况,因此对外界是不可变的(当然不包括反射).