【问题标题】:Two Interacting C# Classes两个交互的 C# 类
【发布时间】:2013-05-09 00:57:26
【问题描述】:

这是一个非常初学者的问题,但我很困惑,我无法弄清楚如何从中得到我想要的。我有我的第一个类获取信息(数据库/文本文件/其他),但我希望它将这些信息传递到 Class2。

比如第一个:

 public class Class1
{
    private int first;
    private string firstString;
    private bool isTrue;

    public void SomeMethod() 
    {
        first = 1;
        firstString = "FirstString";
        isTrue = true;
    }
}

这里SomeMethod 设置了我需要传递给 Class2 的所有属性。

ClassTwo 看起来像

  public class Class2
{
    private int first;
    private string FirstString;
    private bool isTrue;

    private int second;
    private string SecondString;
    private bool isFalse;

    public void SomeOtherMethod() 
    {

    }
}

这里我想要SomeOtherMethod() 使用Class1 的SomeMethod() 中设置的值设置第一组属性。这样我就可以创建一个Class2 类型的对象并添加我想要的内容。

【问题讨论】:

  • 为什么不Class2 包含 Class1,而不是你概括它的所有属性?你有理由吗?否则,您似乎应该查看composition
  • 我认为您希望在 Class2 中添加一个 List<Class1>,而不是重复所有字段多次
  • 问题不清楚,但他可能只是想要一个适配器。
  • @KirkWoll 我想将它们分开,因为一个将用作数据库管理器,而另一个将收集的信息用于其他目的。
  • @AlvinWong 如何获取 Class2 中的 Class1 对象列表?

标签: c# design-patterns interaction


【解决方案1】:

正如其他一些评论员所说,您确实应该重用您的数据定义。这样的事情可以让你开始:

public class Class1
{
    private int _myInt;
    private string _myString;
    private bool _myBool;

    public void SomeMethod() 
    {
        _myInt = 1;
        _myString = "FirstString";
        _myBool = true;
    }
}

public Class2
{
    private Class1 _first = new Class1();
    private Class1 _second = new Class1();

    public void SetFirst(Class1 obj)
    {
       _first = obj;
    }
}

然后使用这样的类:

Class1 c1 = new Class1();
Class2 c2 = new Class2();

c1.SomeMethod();
c2.SetFirst(c1);

【讨论】:

  • 如此简单。谢谢,我觉得我的大脑阻塞了,这正是我所需要的!
  • 不客气。我也患有大脑阻塞的事情:)
【解决方案2】:

您必须为 Class1 的属性定义 get accessors,因为它们都无法从类外部访问,而 Class2 需要使用它们的值。使用 get 访问器定义公共属性可能很有用:

private int first;
public int First
{
    get
    {
        return first;
    }
}

像这样定义 Class1 中的每个属性后,您就可以访问这些值。调用 SomeMethod 后,两个对象的属性可以通过两种简单的方式进行均衡(另见:Signatures and overloading):

public void SomeOtherMethod() 
{
    Class1 tempClass = new Class1();
    tempClass.SomeMethod();

    this.first = tempClass.first;
    this.FirstString = tempClass.firstString;
    this.isTrue = tempClass.isTrue;
}

public void SomeOtherMethod(Class1 myClass) // Overloaded method
{
    this.first = myClass.first;
    this.FirstString = myClass.firstString;
    this.isTrue = myClass.isTrue;
}

尽管上面的技术似乎是您所要求的,但最好的方法是使用constructors 初始化一个类的属性。这样,您不必在每次创建 Class1 对象时调用 SomeMethod,并且您还可以在创建新对象时设置其默认值。此外,为属性提供更通用的名称将使您免于重复。我编写了一些代码来为您提供易于理解的语法,以防止将来出现不可访问性和重复性问题。

public class Class1
{
    private int number;
    public int Number
    {
        get { return number; }
    }

    private string name;
    public string Name
    {
        get { return name; }
    }

    private bool isTrue;
    public bool IsTrue
    {
        get { return isTrue; }
    }

    public Class1()
    {
        number = 1;
        name = "FirstString";
        isTrue = true;
    }

    public Class1(int value1, string value2, bool value3)
    {
        number = value1;
        name = value2;
        isTrue = value3;
    }
}

public class Class2
{
    private Class1 firstClass;
    private Class1 secondClass;

    public Class2()
    {
        firstClass = new Class1();
        secondClass = new Class1(2, "SecondString", false);
    }
}

如果您要在 Class2 中定义许多 Class1 对象,则必须使用数组或列表等解决方案。我举一个简短的例子,见MSDN List page

private List<Class1> class1List = new List<Class1>();
class1List.Add(new Class1());
class1List.Add(new Class1(2, "SecondString", false));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2015-03-11
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多