-2

所以我的问题是关于基本封装。我知道我正在正确设置我的 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);
    }
}

好的,所以为了让我的第二个代码文件操作第一个代码文件中的变量,我需要将它们暴露给这个方法。我不知道是否应该将我的公共变量放在构造函数中,或者是否应该在我的第一个代码文件中的某个地方声明它们。我非常不确定如何将这些变量暴露给这个方法。我一直在摆弄它,但我的书并没有完全解决这种情况,而且我很难弄清楚。

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

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

/ 我搞砸的第二个代码文件中的第二种方法:

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();
        }
    }
}

如果您需要我详细说明以帮助您了解我的情况,请告诉我。我是学习词汇的新手,想理解这个!感谢您的帮助。:)

4

1 回答 1

0

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

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

您还提到了构造函数和私有属性。尝试研究 Imutable 类型。这意味着一旦创建了对象,您就无法更改它。对于您的 clsEncapsulate 类,这意味着使您的字段只读并删除公共设置器。

祝你好运。

于 2012-12-05T05:50:39.160 回答