C# 如何使代码可扩展以供将来使用
我正在尝试构建我的代码,以便将来可以轻松地扩展它,但是我认为我想得太多了,并且正在努力实现这一点 我的设想是: 根据传递给我的一些数据,我需要生成一个类。 我需要生成的类在本质上与其他任何类都不相似 例如,我有几个可以创建的类:C# 如何使代码可扩展以供将来使用,c#,C#,我正在尝试构建我的代码,以便将来可以轻松地扩展它,但是我认为我想得太多了,并且正在努力实现这一点 我的设想是: 根据传递给我的一些数据,我需要生成一个类。 我需要生成的类在本质上与其他任何类都不相似 例如,我有几个可以创建的类: public class File1{ public string Name {get;set;} // etc... } public class File2{ public int ID {get;set;} // etc... } pu
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
}
}
仅仅创建一个抽象类来处理我所有的逻辑,我的做法正确吗?你是说这些类没有任何相似之处。但事实并非如此——它们都需要一个
字符串
来进行一些处理,而这正是您希望在类之间共享的
制作一个接口,IDataProcessor
(或其他)。在这里,有一个方法-voidprocess(string)
。文件类将以它们需要的方式实现该方法
这会将主类开关
更改为简单的
IDataProcessor actualDataProcessor = ...;
actualDataProcessor.Process(myContents);
当然,您仍然需要一些方法来根据扩展创建适当的
IDataProcessor
。根据您的具体需要,一本简单的词典
可能就足够了。否则,如果您愿意,还有很多其他方法可以更动态地绑定类,或者使用显式工厂类。您尝试过使用泛型吗?
以下是一个例子:
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);
}
公共作废流程(字符串内容)
其中T:IProcessStuff,new()
{
//这里的日常工作
// ...
//特殊加工材料
T=新的T();
t、 过程(内容);
}
公共接口IProcessStuff
{
void ProcessStuf(字符串内容);
}
您所说的:非通用返回类型是什么意思?如果您没有通用返回类型,为什么不同时返回一个接口?File1 a=ProcessABC(myContents);file2b=ProcessDEF(myContents);File3 c=ProcessGHIL(myContents);我相信这就是我被卡住的地方。我开始创建一个接口,但对我来说,它所完成的只是修改一些switch语句。(即case.abc“IMyInterface myInterace=new File1();myInterface.Process(data);)@JDS是的,但这是不可避免的(尽管它可以通过元数据或基于约定的配置等“自动化”)。关键是,只有工厂(或配置)本身需要知道这一点——代码的其余部分将始终只使用接口。最后,当您处理任何非抽象的东西时,接口无论如何都不会帮助您-如果您以后需要从类中读取数据,您需要在编译时知道正确的类型。要么确保接口支付租金,要么放弃:)