我正在尝试构建我的代码,以便将来可以轻松扩展它,但是我认为我正在过度思考并努力实现这一目标。
我的情景是: 基于传递给我的一些数据,我需要生成一个类。 我需要生成的类在性质上与任何其他类都不相似。
例如,我有几个可以创建的类:
public class File1{
public string Name {get;set;}
// etc...
}
public class File2{
public int ID {get;set;}
// etc...
}
public class File3{
public string MyType {get;set;}
// etc...
}
在我的主要课程中,我有:
switch (myExtension)
{
case ".abc":
ProcessABC(myContents);
break;
case ".def":
ProcessDEF(myContents);
break;
case ".ghi":
ProcessGHIL(myContents);
break;
//etc...
}
我尝试使用常用方法创建界面:
public ProccessStuff(data);
但我认为这样做不会有效,因为我没有共同的回报类型。
然后我想到了一个抽象类,但似乎我会把很多工作推到那个抽象类中。
public abstract class MyAbstractClass
{
public void ProcessStuff(string data)
{
// Parse the data into an object
// Update some DB fields
// Log some data
}
}
我是否正在创建一个抽象类来处理我的所有逻辑?
答案 0 :(得分:2)
你说这些课程没有任何相似之处。但事实并非如此 - 他们都需要string
进行一些处理,而这正是您希望在类之间共享的。
创建一个界面IDataProcessor
(或其他东西)。在那里,有一个方法 - void Process(string)
。文件类将以他们需要的方式实现该方法。
这会将您的主要课程switch
更改为简单的
IDataProcessor actualDataProcessor = ...;
actualDataProcessor.Process(myContents);
当然,您仍然需要某种方法来创建适当的IDataProcessor
基于例如扩展名。根据您的确切需求,简单的Dictionary<string, Func<IDataProcessor>>
可能就足够了。否则,还有很多其他方法可以根据需要更动态地绑定类,或使用显式工厂类。
答案 1 :(得分:0)
您是否尝试过使用泛型? 这是一个例子:
public void Process<T>(string contents)
where T : IProcessStuff, new ()
{
// Common work to do here
// ...
// Specific processing stuff
T t = new T();
t.ProcessStuf(contents);
}
public interface IProcessStuff
{
void ProcessStuf(string contents);
}