除非不需要为所有其他方法禁止使用setter,否则不需要为私有变量成员声明访问器,但是使用readonly字段比避免使用无用的CPU Proc调用而无需花费滴答计时的属性要更快地优化了速度。 。
我正在用C#开发一个电话簿控制台应用程序,这是迄今为止我最大的项目:)我认为自己是一个初学者,但我想提高[]
我正在使用3个类来创建它,它们是:
Modifications类负责添加,删除和编辑联系人。搜索和显示类是不言自明的。我还为每个这些类提供了接口。
我在Modifications类中创建了KeyValuePair列表,如下所示:
private List<KeyValuePair<string , int>> AllContacts { get; set; } public Modifications() { AllContacts = new List<KeyValuePair<string, int>>(); }
我想在其他类中访问此
AllContacts
对象。但是我在保持封装的同时未能实现这一目标。AllContacts
就像我的主要数据来源。我在此列表中添加联系人。我不希望主要方法中的某人像modificationObject.AllContacts.Clear();
[如果愿意,请跳过此:)]
我的悲伤尝试第1部分:
] >>-继承自基类修改的显示类
-在我的Modifications类中,我创建了一个List<KeyValuePair<string , int>>
类型的受保护属性,并将其命名为“ AllContacts”作为数据库
-在我的Display类中,我创建了一个与上述类型相同的私有属性,并将其命名为_allContacts
-在我的Display类的构造方法中,我请求了一个名为ModObject的Modification类型对象
-我说过,_data = modObject.AllContacts;
-它没有用,我想这是因为只有派生对象才能获得此属性?
我的不幸尝试第2部分:
] >>-假设我的假设是正确的,我试图将modObject转换为其派生类类型Display。出现了编译错误。试图制作一个受保护的GetAllContacts()
方法,编译错误。
我的悲伤尝试第6部分:
-最后,我只是将其设置为带有私人安装员的公共财产。我的应用程序可以运行,但是人们仍然可以以某种方式使用我的主要方法x.AllContacts.Clear()
。
如何在不破坏封装的情况下在其他类中使用AllContacts
对象?可能吗
最初,我为数据创建了一个单独的类,并且我还有其他3个类(Modification,Search和Display),这是一个更好的设计,对吗?访问其他类中的数据对象时,我遇到了同样的问题。
谢谢:)
修改类别:
]public class Modifications { public List<KeyValuePair<string, int>> AllContacts { get; private set; } public Modifications() { AllContacts = new List<KeyValuePair<string, int>>(); } ....
显示类别:
]
public class Display : IDisplayable { private List<KeyValuePair<string, int>> AllContacts; public Display(Modifications modificationsObject) { AllContacts = modificationsObject.AllContacts; } ....
[我正在用C#开发一个电话簿控制台应用程序,这是我迄今为止最大的项目:)我认为自己是一个初学者,但是我想改进一下,我正在使用3个类来创建它,这些是:...
除非不需要为所有其他方法禁止使用setter,否则不需要为私有变量成员声明访问器,但是使用readonly字段比避免使用无用的CPU Proc调用而无需花费滴答计时的属性要更快地优化了速度。 。
要从其他类访问它,必须像这样将其声明为公共:
public List<KeyValuePair<string , int>> AllContacts { get; private set; }
因此其他类可以读取引用,并调用List实例的变量访问器和方法,例如Count和Add,但是它们不能替换此实例引用,因此不能更改对象本身。
但是,如果您想禁止操作列表,则可以实现要公开的所有包装方法,例如Count,Add,Delete,Remove等以及索引器,并且可以指示该类实现了IExumerable<KeyValuePair<string , int>>
。
通过这种方式,您可以得到强大的封装:
public class MyClass: IEnumerable<KeyValuePair<string , int>>
{
private readonly List<KeyValuePair<string , int>> AllContacts
= new List<KeyValuePair<string , int>>();
public int ContactsCount
{
get { return AllContacts.Count; }
}
public KeyValuePair<string , int> this[int index]
{
get { return AllContacts[index]; }
set { AllContacts[index] = value; } // don't declare if readonly
}
// if adding is allowed
public int Add(KeyValuePair<string , int> item)
{
...
}
...
}
除非不需要为所有其他方法禁止使用setter,否则不需要为私有变量成员声明访问器,但是使用readonly字段比避免使用无用的CPU Proc调用而无需花费滴答计时的属性要更快地优化了速度。 。