假设我们有一个类Potato(和因此实例),它具有属性平滑性,用于其他方法但不假装是公共的。创建实例时会设置此属性,并且仅在实例内部使用该属性。
此外,我的系统应该支持多个数据库驱动程序,因此我有一个接口“数据库适配器”,它将使用我想要使用的驱动程序的类进行实例化。
现在出现了问题。我需要使对象(马铃薯)持久化并将其保存到数据库中,因此我应该使用数据库适配器类来保存马铃薯的平滑度,但是......它是私有的! 我怎样才能发送马铃薯的光滑度而不能将其用于其他目的?
提前致谢
答案 0 :(得分:2)
编写一个允许对象保存自身的方法,将某种类型的编写器作为参数。由于这是一个数据库,您可能需要同时使用Insert和Update方法,而不仅仅是Save方法。您也可以将它们放入界面中。
粗略的例子:
public interface IDatabaseSaveable
{
void InsertToDatabase(Database pDatabase);
void UpdateDatabase(Database pDatabase);
}
public class Potato : IDatabaseSaveable
{
private int mID;
private double mSmoothness;
public void InsertToDatabase(Database pDatabase)
{
pDatabase.InsertToPotatoes(mID, mSmoothness, ...);
}
public void UpdateDatabase(Database pDatabase)
{
pDatabase.UpdatePotatoes(mID, mSmoothness, ...);
}
}
答案 1 :(得分:2)
您可以创建导入器/导出器接口对,以外部化Potato
的“状态”,而无需访问其实现详细信息(在本例中为其私有成员和数据类型)。他们是建设者的类型。
public class Potato {
public interface IExporter {
void AddSmoothness(string value);
}
public interface IImporter {
string ProvideSmoothness();
}
public Potato(IImporter importer) {
this.smoothness = int.Parse(importer.ProvideSmoothness());
}
public void Export(IExporter exporter) {
exporter.AddSmoothness(this.smoothness.ToString());
}
public Potato(int smoothness) {
this.smoothness = smoothness;
}
private int smoothness;
}
然后,您的数据库适配器类将实现相关接口并使用相应的方法。看here了解最初的想法。
答案 2 :(得分:1)
这是将平滑属性标记为internal
的变体。假设马铃薯必须具有smoothness
设置才能使用它,内部构造函数可能会更好。我会凭信心接受,有理由隐藏顺畅。或许马铃薯的谦虚?
public class Potato
{
internal int Smoothness { get; set; }
internal Potato(int smoothness)
{
this.Smoothness = smoothness;
}
private Potato() { }
}
只有同一程序集中的类才能使用内部构造函数实例化Potato
。并且只有同一个程序集中的类才能访问平滑度(因此它们可以保存马铃薯。)