2013-06-23 66 views
0

我来自脚本背景,试图破解一些C#在一起。所以我不知道如何解释这个问题,但我确定我在问这个问题,因为我不了解OOP,我毫无疑问需要!C#基于客户端操作系统的分支代码

基本上我有三类:

class OSThingy 
class XP : OSThingy 
class Win7 : OSThingy 

在“OSThingy”类包含共同属性和其中两个衍生物类需要一些方法。每个派生类都实现了一个接口,为他们提供了一些实现方式不同的常见方法。 XP和Windows 7之间的实现差别很大,所以我想把它们放在不同的类中。我也希望这个设计能够很容易地删除XP相关的东西,当它不再需要时。

在我的程序的入口点,我想创建取决于它是否在Windows XP或Windows 7运行正确的类的实例,这是我到目前为止有(其中不工作):

dynamic OSClass; 
if (Environment.OSVersion.Version.ToString().StartsWith("5.1")) 
{ 
    OSClass = new XP(); 
} 
else 
{ 
    OSClass = new Win7(); 
} 
// Later on I use OSClass 
OSClass.DoSomething(); 

但是,由于我使用的是动态关键字,因此Intellisense不起作用。当我稍后使用其中一个派生类时,是否有任何方法可以保留(至少部分)Intellisense?

我在想如果我将接口应用到“OSThingy”类并用“OSThingy”替换动态,我至少会获得在“OSThingy”中定义的方法和属性的Intellisense,但不知道这是否正确方式去了解它。

我确定答案是肯定的,但是在Windows XP和Windows 7 +之间分支代码路径有更好的方法吗?

回答

0

看样子你对你实现一些方法(在接口上定义)的基类未在OSThingy上定义。正如我所看到的,你有几个选择如何进行。

1.移动界面的方法来OSThingy

如果你的接口方法适用于每一个OSThingy执行,然后定义上OSThingy方法为抽象的,例如

OSThingy osClass; 
osClass = new XP(); 
osClass.Shutdown(); 

2.创建从OSThingy

衍生的新的基类,创建从OSThingy衍生的新类,例如其中包含仅适用于Windows操作系统的方法。

WindowsOSThingy osClass; 
osClass = new XP(); 
osClass.StartTaskManager(); 

3.演员酌情

投放到您的接口/基类,当你需要的类型,例如方法

OSThingy osClass; 
osClass = new XP(); 
IWindowsOS windowsOS = (IWindowsOS)osClass; 
windowsOS.StartTaskManager(); 

你可以利用as操作的,如果你不能肯定该类型实现IWindowsOS,例如

OSThingy osClass; 
osClass = new XP(); 
IWindowsOS windowsOS = osClass as windowsOS; 
if(windowsOS != null) 
    windowsOS.StartTaskManager(); 

3.进行使用泛型方法

private void DoSomethingForWindowsOS<T>(T osClass) 
    where T : OSThing, IWindowsOS 
{ 
    // Nonsense code 
    osClass.StartTaskManager(); 
    osClass.Shutdown(); 
} 

有很多可行的选择,而不参照使用dynamic关键字。

+0

谢谢你Lukazoid!这是一个非常全面的解释。我想我有几个选择要考虑! – Timothy

3

是的,只写

OSThingy runningOS; 

没有理由在这里使用dynamic

0

你不应该在这种情况下声明动态(事实上,很少)。区分在方法或实例与静态方法或实例之间。默认情况下,类和它们的方法是非静态的(阅读:动态),除非你声明它们是静态的。

在看待事物更IDE级,VS有时候行为有点滑稽,我和智能感知会随机退出工作。保存并重新启动VS为我解决这个问题。

还要说明一点,如果你要使用此对系统的人数不详,你不能绝对保证操作系统的版本,你应该有针对性地在你的代码。确保你也可以容纳次要版本,因为有些人可能没有安装最新的服务包,只有在5.3或5.2版本的人试图使用它时才会引发异常(以及6。 X为Vista,或8.x中为Windows 8)

+0

嗨迈克,感谢您的评论。仅供参考,我的XP测试系统是SP3,但版本号返回5.1。我相信5.1.2600是XP SP3。 – Timothy

+0

有趣的是,我不知道。你会认为他们会使用5.1.xxxx来表示已发布的小补丁。好'微软,从来没有意义哈哈 – mikedugan

0

我在想,如果我申请界面到“OSThingy”级和 替换动态的“OSThingy”,我就至少得拿到智能感知 方法和“OSThingy”中定义的属性,但不知道这是否是正确的方式去解决它。

这是一个精确的路要走!这是继承类/接口的主要好处之一,您可以创建同一个基的多个实现,并且在使用它们时不关心具体细节。如果你以后需要一些特定的方法/属性只属于某个子类,那么你所需要的就是将其转换为对应的类型。除非绝对必要,否则我会尽量避免dynamic

顺便说一句,你不必在这里使用的界面,你已经有了,你可以用OSThingy

+0

感谢Walther的提示。我想避免动态是要走的路! :) – Timothy

相关问题