【发布时间】:2011-07-08 21:35:17
【问题描述】:
尽我所能搜索,但不幸的是我没有学到任何相关的东西;基本上我正在尝试解决 C# 中的以下问题...
例如,我有三个可能的引用(refA、refB、refC),我需要根据配置选项加载正确的一个。但是到目前为止,我看不到一种不需要我在整个代码中使用所述引用对象的名称的方法(提供了引用的对象,我无法更改它们)。希望下面的代码更有意义:
public ??? LoadedClass;
public Init()
{
/* load the object, according to which version we need... */
if (Config.Version == "refA")
{
Namespace.refA LoadedClass = new refA();
}
else if (Config.Version == "refB")
{
Namespace.refB LoadedClass = new refB();
}
else if (Config.Version == "refC")
{
Namespace.refC LoadedClass = new refC();
}
Run();
}
private void Run(){
{
LoadedClass.SomeProperty...
LoadedClass.SomeMethod(){ etc... }
}
如您所见,我需要将 Loaded 类公开,因此我尝试在加载所需的真实类时“动态”更改类型。 refA、refB 和 refC 中的每一个都将实现相同的属性和方法,但名称不同。同样,这是我正在使用的,而不是我的设计。
话虽如此,我试图了解接口(听起来像是我所追求的),但我正在查看它们并看到严格的类型 - 这对我来说很有意义,即使它不是对我有用。
欢迎任何和所有想法和意见,如有必要,我会澄清任何事情。请原谅我在术语上犯的任何愚蠢错误,我是第一次学习所有这些。到目前为止,我真的很喜欢使用 OOP 语言 - 来自 PHP 的这些东西让我大吃一惊:-)
编辑
很抱歉根本没有说清楚,但是 refA、refB、refC 中的每一个都有其方法的独特类型,即使它们在功能方面基本上是相同的(想法是它们是版本化的)。这意味着有了一个界面,在我看来,我只剩下:
public interface IRef
{
SomeType<<RefA,RefB,RefC,???>> SomeProperty {get;}
void SomeMethod();
}
感谢 GenericTypeTea 提供的起始接口点。我可能正在尝试做一些不推荐/不可能的事情......根本问题是我需要支持来自同一程序的不同版本(根据配置选项);或者我将为每个版本开发“不同”的程序,这只是一个可怕的混乱:-)
编辑 2
public interface Sage
{
SageDataObject???.SDOEngine sdo;
}
class SageObj150 : Sage
{
SageDataObject150.SDOEngine sdo = new SageDataObject150.SDOEngine();
}
class SageObj160 : Sage
{
SageDataObject160.SDOEngine sdo = new SageDataObject160.SDOEngine();
}
class SageObj170 : Sage
{
SageDataObject170.SDOEngine sdo = new SageDataObject170.SDOEngine();
}
其中 SDOEngine() (我刚刚看到)是一个接口本身 - 我认为这会使事情变得非常混乱。从不了解 C# 的情况下,我认为我在编写整个应用程序方面做得很好,但现在这似乎超出了我的 Google 技能。提前感谢大家的耐心等待!
【问题讨论】:
-
“refA、refB 和 refC 中的每一个都将实现相同的属性和方法但名称不同。” 我解释为属性和方法不同,但现在我猜你可能只是说
refArefB和refC有不同的名称? -
所以
SomeType可能是string、bool或'int'? -
不完全是,它们都是每个 refA、refB、refC 的特定对象。
-
现在它开始闻起来像是应该使用generics 解决的解决方案,或者使用我建议的adapter pattern。当然,只有如果你可以定义一个通用适配器,这取决于类型转换。
-
@b3njamin - 在不了解
SomeType<<RefA,RefB,RefC,???>> SomeProperty {get;}的情况下,我真的无法提供进一步的解决方案。也许您应该发布 RefA、RefB 和 RefC 的代码?