【问题标题】:How to communicate two classes? [closed]如何沟通两个班级? [关闭]
【发布时间】:2023-03-27 14:31:01
【问题描述】:

我想让两个班级互相交流。我想使用字典来添加项目。我已经简化了我的模式以轻松解决它。如何使用字典添加新项目。

我只想生成MyClass 的一个实例。这很重要。这是一种诡计……

public interface IHost
{

}

public class MyClass:IHost
{
   public Dictionary<int,string>; dic { get; set;}

   public MyClass()
   {
       dic =  new Dictionary<int,string>();
   }
}

public class  MyClass2 : IHost
{
    public MyClass()
    {

    }

    public void Save()
    {
      dic.Add(1,"vxcvcx");
    }
}

我得到的错误:

名称'dic'在当前上下文中不存在

【问题讨论】:

  • 请澄清您的问题(尽管从技术上讲,您并没有提出任何问题)。你到底想做什么?你能发布实际编译的代码吗(有或没有你说你遇到错误的行)。
  • @StevenJeuris:不是每个人都以英语为主要语言。
  • @jgauffin: ...但是每个人可以在他们的浏览器中安装一个内置的拼写检查器,并且至少与他们的拼写错误保持一致。如果您不知道如何写“交流”,请不要时不时地用不同的方式来写,查一下。我也不会说母语英语,但仍时不时查单词。 P.s.:问题的其余部分并没有表明任何努力。看来语言是这种努力的代表。
  • @StevenJeuris:是的。您应该在第一条评论中写下详细的描述。
  • 将“Save”函数放入“MyClass”中。

标签: c# .net design-patterns


【解决方案1】:

只需将MyClass 作为构造函数变量传递给class2:

public class MyClass:IHost
{
   public Dictionary<int,string> dic { get; set;}

   public MyClass()
   {
       dic =  new Dictionary<int,string>();
   }

   public void Add(int key, string value)
   {
       dic.Add(key, value);
   }
}

public class  MyClass2 : IHost
{
    MyClass1 _class1;

    public MyClass2(MyClass1 instance)
    {
        _class1 = instance;
    }

    public void Save()
    {
      _class1.Add(1,"vxcvcx");
    }
}

【讨论】:

  • 第 3 行分号过多。
  • @vidstige:谢谢。问题中的原始代码(我编辑的是 HTML 编码)
【解决方案2】:

使用基类而不是接口:

abstract class MyBaseClass
{
    public Dictionary<int,string> dic { get; set; }

    public MyBaseClass()
    {
        dic = new Dictionary<int, string>(5);
    }

    public void Add(int key, string value)
    {
        dic.Add(key, value);
    }
}

public class MyClass1 : MyBaseClass
{
    public MyClass1():base()
    {          
    }        
}

public class MyClass2 : MyBaseClass
{
    public MyClass2():base()
    {

    }

    public void Save()
    {
        Add(1, "somevalue");
    }
}

【讨论】:

  • 满足只有一个 MyClass 实例的要求,我假设这意味着只有一个字典,值得将 dic 标记为静态并在静态构造函数中初始化...
【解决方案3】:

要么:

  1. MyClass2 需要一个MyClass1 实例的引用,那么它可以调用someMyClass1.dic.Add()?
  2. MyClass2 需要对 MyClass1 实例中的字典的引用,然后对 dic.Add() 的调用将起作用,因为它将其 dic 设置为 MyClass1 的 dic 的值。
  3. MyClass2 需要从 MyClass1 派生,那么它是 MyClass1 的一种更特殊的类型,可以访问所有公共和受保护的成员,就好像它们是在上面定义的一样。

【讨论】:

    【解决方案4】:

    将 MyClass1 设为单例并从 MyClass 2 访问 dic 变量...我是否正确理解了场景?

    【讨论】:

      【解决方案5】:

      我将解决明显的问题。

      public Dictionary<int,string>; dic { get; set;} 
      

      应该是

      public Dictionary<int,string> dic;
      

      以下代码不起作用,您必须在 MyClass2 中定义一个 Dictionary 变量,才能使此代码起作用。

      public class  MyClass2 : IHost   {       public MyClass()       {          }          public void Save()       {         dic.Add(1,"vxcvcx");       }   }   
      

      如果作者更新了问题,并实际解释了他们想要达到的目标,我会更新我的答案。

      我应该添加... MyClass 类不是必需的,字典应该在 MyClass2

      中创建

      【讨论】:

        猜你喜欢
        • 2017-07-26
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        相关资源
        最近更新 更多