封装多个类C#

时间:2012-12-05 05:15:12

标签: c# encapsulation

所以我的问题是基本的封装。我知道我正在设置我的getter和setter(我实际上后来有一个问题)但我有多个类。我有另一个课程,我明白通过公开某些事情,我正在将我的代码片段视为我的外部课程。所以我认为我正确设置了我的第一个代码文件。 (有些背景,我有一个连接到数据库的类,然后是另一个封装所有数据的类。发布的第一个代码部分是封装部分,然后我发布了我搞乱的三种方法。)

我对获取和设置感觉很好,我觉得我的构造函数有点不确定。我觉得我把变量放在参数列表中,以便从外部类中放入值?对?或者我应该将我的私有变量的公共形式放在我的其他代码文件中,然后将它们传递到同一文件中的构造函数中?

/这是我的第一个代码文件

using System;

public class clsEncapsulate
  {
    private int mID;
    private string mName;
    private string mClassification;
    private DateTime mConvocationDate;
    private string mLocation;

public int ID
{
    get
    {
        return mID;
    }
    set
    {
        mID = value;
    }
}

public string Name
{
    get 
    {
        return mName;
    }
    set 
    {
        mName = value;
    }
}

public string Classification
{
    get
    {
        return mName;
    }
    set 
    {
        mName = value;        
    }
}

private DateTime ConvocationDate
{
    get
    {
        return mConvocationDate;
    }
    set
    {
        mConvocationDate = value;
    }
}

private string Location
{
    get
    {
        return mLocation;
    }
    set
    {
        mLocation = value;
    }
}

public clsEncapsulate(int id, string name, string classification, DateTime convocationDate, string location)
{
    bool running = false; 

    while(running == false)
    {

    ID = mID;
    Name = mName;
    Classification = mClassification;
    ConvocationDate = mConvocationDate;
    Location = mLocation;

    running = true;

    }
}

}

在我的第二个代码文件中,我将把我遇到问题的方法放在上面。

private void refreshbox()
{
    string formattedConvocation;
    string formattedDateTime;
    string formattedConvocationName;

    lstConvocations.Items.Clear();
    foreach (clsEncapsulate currentConvocation in mConvocationAL)
    {
        formattedConvocationName = currentConvocation.Name;
        formattedConvocationName = truncateString(formattedConvocationName, 30);

        formattedConvocation = formattedConvocationName.PadRight(33);
        formattedConvocation += currentConvocation.Classification.PadRight(17);

        formattedDateTime = currentConvocation.ConvocationDate.ToShortDateString().PadRight(10)
            + currentConvocation.ConvocationDate.ToShortTimeString().PadLeft(8);
        formattedConvocation += formattedDateTime;

        lstConvocations.Items.Add(formattedConvocation);
    }
}

好吧,为了让我的第二个代码文件操作第一个代码文件中的变量,我需要将它们暴露给这个方法。我不知道是否应该将我的公共变量放在构造函数中,或者我是否应该在我的第一个代码文件中将它们声明。我不确定如何将这些变量暴露给这个方法。我已经搞砸了,但我的书并没有完全解决这个问题,而且我很难搞清楚。

如果有人回答了这个问题,请分解你为什么要放置你要放的东西!我想理解为什么,比方说,我把我的公共变量放在一个地方,而不是另一个地方。或者为什么我在一个地方而不是另一个地方声明我的封装类的对象。我试图在我的方法中声明一个封装对象,所以它会让这个方法访问变量,但它不起作用!请告诉我我做错了什么,或者你是否希望我发布更多我的代码。

以下是我搞砸的另外两种方法。

我的第二个代码文件中的

/ second方法搞砸了:

private void displayProperties(int index)
{
    if (index == -1)
    {
        return;
    }

    clsEncapsulate selectedValue = (clsEncapsulate)mConvocationAL[index];


    txtConvocationName.Text = selectedValue.Name;
    txtConvocationClassification.Text = selectedValue.Classification;
    txtConvocationDate.Text = selectedValue.ConvocationDate.ToShortDateString();
    txtConvocationTime.Text = selectedValue.ConvocationDate.ToShortTimeString();
    txtConvocationLocation.Text = selectedValue.Location;
    txtID.Text = selectedValue.ID.ToString();
}

/最后一种方法我搞砸了:

  private void readConvocations(string filterConstraint, string sortField, string     sortOrder)
{
        OleDbConnection connection = null;
    OleDbDataReader reader = null; 

    try
    {
        connection = new OleDbConnection();
        connection.ConnectionString = mConnectionString;

        connection.Open();

        string statement = "SELECT ID, Name, Classification, Location, Date FROM Convocations ";
        if(filterConstraint != "")
           {
                statement += "WHERE Name LIKE " + toSQL(filterConstraint, true) + " "; 
           }
            string statement2 = statement;
        statement = string.Concat(new string[]
        {
            statement2, "ORDER BY ", sortField, " ", sortOrder

        });

        OleDbCommand oleDbCommand = new OleDbCommand(statement, connection);
        reader = oleDbCommand.ExecuteReader();
        mConvocationAL.Clear();

        while(reader.Read())
        {

            clsEncapsulteconvocation = new clsEncapsulate();
            convocation.ID = (int)reader["ID"];
            convocation.Name = (string)reader["Name"];
            convocation.Classification = (string)reader["Classification"];
            convocation.Location = (string)reader["Location"];
            convocation.ConvocationDate = (DateTime)reader["Date"];

            mConvocationAL.Add(convocation);

        }
    }
    finally
    {
        if (reader != null)
        {
            reader.Close();
        }

        if (connection != null)
        {
            connection.Close();
        }
    }
}

告诉我你是否需要我详细说明,以帮助你了解我的情况。我是学习词汇的新手,想要了解这一点!谢谢你的帮忙。 :)

1 个答案:

答案 0 :(得分:0)

您提供的代码是一个公共对象和一堆私有方法,因此很难全面了解您的代码如何协同工作,但是您可以应用一些原则来使代码更好地构建,现在和在将来。

阅读有关SOLID的信息(http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))。 S和D适用于你的例子。

你也提到了建筑师和私人财产。尝试查看Imutable类型。这意味着一旦创建了对象,就无法更改它。对于clsEncapsulate类,这意味着将字段设为只读并删除公共设置器。

祝你好运。