我试图以更好的方式组织我的功能和课程。目前我有以下主要类(注意:所有这些类都有很多属性和功能,但为了澄清,我将它们全部清除掉):
internal class Class0{ }
internal class Class1: Class0 { }
internal class Class2: Class1
{
List<Class1> mainDataStructure;
}
我对上述课程的组织非常好,但我主要关注的是课程。
public class Class3: Class2
{
InsertClass anInstance = new InsertClass();
public void Insert(Item item)
{
anInstance.mainDataStructure = mainDataStructure;
anInstance.Insert(item);
}
}
internal class InsertClass
{
List<Class1> mainDataStructure;
internal void Insert(Item item)
{
// adds item to mainDataStructure.
// some clean-ups using following function
// how to clean-up ? User will define it.
CleanUp();
}
// a function that use should implement
// define it as:
internal abstract string CleanUp();
// or as:
internal Func<string> CleanUp();
}
正如您所注意到的,当我尝试定义操纵Class4
的某些类(例如mainDataStructure
)时,我的问题就出现了。我能做的(就像我在这里所做的那样)是将mainDataStructure
传递给将操纵它的类。虽然它有效,但对我来说它似乎并不优雅。我想知道是否有可能以更好的方式重新组织我的Class3
和Class4
。
此外,操纵mainDataStructure
的类(例如Class4
)有一些应该由最终用户定义的功能......我完全停留在那里!如果我将函数定义为abstract
,则用户必须继承该类并在子类中定义abstract
函数,或者如果我使用委托Func<>
定义它们,则用户必须传递函数定义。这些解决方案的主要关注点是班级的可访问性级别!我非常赞赏地只公开Class3
。因此,继承是不可能的,对于委托,新组织应该有一种方法将函数定义从Class4
内传递给Class3
。
我感谢这个项目组织的任何帮助。
班级解释
该项目是一个信息检索项目。 mainDataStructure
存储信息。
Class3
是一种用户界面。用户通过获取此类的实例来开始交互;并通过该实例执行所有操作(例如,添加新信息,检索,统计信息等)。
Class4
向mainDataStructure
添加了新信息。
Class5
检索存储信息之间的某种相似性。
Class6
获取mainDataStructure
的一些统计信息(例如,右尾概率)
等等。
示例:添加新信息项
使用Class3
的实例并调用public void Add(Item item)
。然后,此方法将使用Class4
及其internal void Add(Item item)
方法的实例来处理所有新项目插入过程。见上面修改过的代码
答案 0 :(得分:1)
public interface MainDataStructureManipulations {
// define all needed functions here.
}
public abstract class Class3 {
static Class3 getInstanceWith(MainDataStructureManipulations strategy) {
return new Class4(strategy);
}
private Class3() {}
}
internal class Class4 : Class3 {
MainDataStructureManipulations strategy;
public Class4(MainDataStructureManipulations strategy) {
this.strategy = strategy;
}
}
如果您的所有策略要求都包含在Class4
中,则可能甚至不需要额外的MainDataStructureManipulations
。
Factory是一种为您创建对象实例的方法。最棒的是你不必确切地知道这个实例是哪个类,只要它实现了工厂指定的基类。在上面的这种情况下,您不必公开Class4
,并且库的用户也将永远不会看到它,但是可以与实例交互,就像从{{派生的类的任何实例一样1}}。
策略使用简单方法封装功能。我选择它是因为它似乎非常适合你的描述,但我可能错了。策略只保存交互方法,如果你想存储状态,可能另一种模式更合适。如果你告诉我们你真正想做什么,我们可以提供更详细的建议。