所以我的问题是基本的封装。我知道我正在设置我的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();
}
}
}
告诉我你是否需要我详细说明,以帮助你了解我的情况。我是学习词汇的新手,想要了解这一点!谢谢你的帮忙。 :)
答案 0 :(得分:0)
您提供的代码是一个公共对象和一堆私有方法,因此很难全面了解您的代码如何协同工作,但是您可以应用一些原则来使代码更好地构建,现在和在将来。
阅读有关SOLID的信息(http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))。 S和D适用于你的例子。
你也提到了建筑师和私人财产。尝试查看Imutable类型。这意味着一旦创建了对象,就无法更改它。对于clsEncapsulate类,这意味着将字段设为只读并删除公共设置器。
祝你好运。