静态的方法,在一个界面/抽象的类
-
08-06-2019 - |
题
第一,我理解为什么一接口或抽象的类(。NET/C#术语)不能有静态的抽象的方法。我的问题是那么多集中在更好的设计方案。
什么我想要的是一套的"助手"类都有自己的静态的方法,这样,如果我得到的对象,A、B和C,从第三方供应商,我可以有助手类方法比如
AHelper.RetrieveByID(string id); AHelper.RetrieveByName(string name); AHelper.DumpToDatabase();
因为我AHelper,BHelper,并CHelper类的所有基本上相同的方法,它似乎有意义的移动这些方法中的一个接口,这些课程后获得。但是,希望这些方法是静态的排除了我从具有一个通用的接口,或者抽象的类的所有他们推导出。
我总是可以使这些方法的非静态和随后的实例的对象的第一个这样的因为
AHelper a = new AHelper(); a.DumpToDatabase();
然而,这个代码似乎不如直到我。你有什么建议吗?我应该放弃使用一个接口,或者抽象的级的完全(情况我现在)或者可以这可能是进行了重构,以完成设计我在寻找什么?
解决方案
看 你的反应 我在想如下:
- 你可能只有一个静态的方法,需要一种类型参数和执行预期的逻辑基础上的类型。
- 你可以创建一个虚拟的方法在你抽象的基地,在那里指定SQL在具体类。所以包含所有的共同的代码这就是需要(例如exectuting的命令和返回的目的)的同时封的"专家"的位(例如SQL)在该分类。
我喜欢第二个选项,尽管其当然下降到你。如果你需要我走进一步详细说明,请让我知道,我将乐于编辑/更新)
其他提示
如果我是你我会尽量避免任何静。恕我直言我永远结束了某种形式的同步问题时,与静。这就是说你正在提出一个经典的例的通用程序使用的模板。我将通过的模板的基础的解决方案的抢劫铜中提出的一个员额上。
对于一个通用的解决您的例子,可以这样做:
public static T RetrieveByID<T>(string ID)
{
var fieldNames = getFieldNamesBasedOnType(typeof(T));
QueryResult qr = webservice.query("SELECT "+fieldNames + " FROM "
+ tyepof(T).Name
+" WHERE Id = '" + ID + "'");
return (T) qr.records[0];
}
我个人也许会问,为什么每种类型需要有一个静态的方法之前,甚至进一步思考..
为什么不建立一个utlity类的静态的方法,他们需要分享吗?(例如 ClassHelper.RetrieveByID(string id)
或 ClassHelper<ClassA>.RetrieveByID(string id)
以我的经验这种"障碍"的问题不是局限性的语言,但是限制我的设计。
怎么ObjectA和AHelper有关系吗?是 AHelper.RetrieveByID()
同样的逻辑 BHelper.RetrieveByID()
如果是,如何约一个实用工具类基础的方法(类与公共静态的方法只以及没有一个国家)
static [return type] Helper.RetrieveByID(ObjectX x)
你不能超载方法,通过不同的仅仅是返回的类型。
你可以使用不同的名称:
static AObject GetAObject(string id);
static BObject GetBObject(string id);
或者你可以创建一个类铸运营商:
class AOrBObject
{
string id;
AOrBObject(string id) {this.id = id;}
static public AOrBObject RetrieveByID(string id)
{
return new AOrBObject(id);
}
public static AObject explicit operator(AOrBObject ab)
{
return AObjectQuery(ab.id);
}
public static BObject explicit operator(AOrBObject ab)
{
return BObjectQuery(ab.id);
}
}
然后你可以叫它,像这样:
var a = (AObject) AOrBObject.RetrieveByID(5);
var b = (BObject) AOrBObject.RetrieveByID(5);
C#3.0、静态的方法可以使用的接口,如果他们是他们的一部分通过使用扩展的方法,作为与DumpToDatabase()如下:
static class HelperMethods
{ //IHelper h = new HeleperA();
//h.DumpToDatabase()
public static void DumpToDatabase(this IHelper helper) { /* ... */ }
//IHelper h = a.RetrieveByID(5)
public static IHelper RetrieveByID(this ObjectA a, int id)
{
return new HelperA(a.GetByID(id));
}
//Ihelper h = b.RetrieveByID(5)
public static IHelper RetrieveByID(this ObjectB b, int id)
{
return new HelperB(b.GetById(id.ToString()));
}
}
我怎么后的反馈堆溢?编辑我原来的岗位或后一个"答复"?无论如何,我认为它也许有助于给一个例子是怎么回事AHelper.RetrieveByID()和BHelper.RetreiveByID()
基本上,这两种方法都要对抗第三方服务,返回的各种通用的(料)目采用一种查询方法,需要在一个伪SQL串作为其唯一的参数。
因此,AHelper.RetrieveByID(string ID)可能看起来像
public static AObject RetrieveByID(string ID) { QueryResult qr = webservice.query("SELECT Id,Name FROM AObject WHERE Id = '" + ID + "'"); return (AObject)qr.records[0]; } public static BObject RetrieveByID(string ID) { QueryResult qr = webservice.query("SELECT Id,Name,Company FROM BObject WHERE Id = '" + ID + "'"); return (BObject)qr.records[0]; }
希望这有所帮助。正如你可以看到,这两种方法是相似的,但是,查询可能相当一点不同于根据不同对象的类型正在返回。
哦,罗伯,我完全同意--这是更可能限制我的设计并不是语言。:)
你是在寻找多形态的行为?然后你会想要的接口和正常的构造。什么是直观的有关调用的一个构造?如果你不需要多态性(音像你不要使用它现在的),然后你可以坚持你的静态的方法。如果这些是所有的包装供应商的成分,那么也许你可以尝试使用工厂的方法来建立他们喜欢VendorBuilder.GetVendorThing("A"),这可能返回的一个目的类型IVendorWrapper.