[如何在保持封装的同时访问不同类别的对象? (数据?)

问题描述 投票:0回答:1

我正在用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)
  {
    ...
  }

  ...

}
c# oop encapsulation
1个回答
1
投票

除非不需要为所有其他方法禁止使用setter,否则不需要为私有变量成员声明访问器,但是使用readonly字段比避免使用无用的CPU Proc调用而无需花费滴答计时的属性要更快地优化了速度。 。

© www.soinside.com 2019 - 2024. All rights reserved.