基于客户端操作系统的C#分支代码

本文关键字:分支 代码 操作系统 客户端 | 更新日期: 2023-09-27 18:19:32

我来自脚本后台,试图一起破解一些C#。所以我不知道该如何表达这个问题,但我确信我问这个问题是因为我对OOP没有理解,这无疑是我所需要的!

基本上我有三个班:

class OSThingy
class XP : OSThingy
class Win7 : OSThingy

"OShingy"类包含两个派生类都需要的公共属性和一些方法。每个派生类都实现了一个接口,该接口为它们提供了一些实现不同的通用方法。XP和Windows7的实现差别很大,所以我想把它们放在不同的类中。我也希望这个设计能让你在不再需要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();

但是,因为我使用的是dynamic关键字,Intellisense不起作用。当我稍后使用其中一个派生类时,有什么方法可以保留(至少部分)Intellisense吗?

我在想,如果我将接口应用于"OSThingy"类,并将dynamic替换为"OSthinky",我至少会为"OShingy"中定义的方法和属性获得Intellisense,但不确定这是否是正确的方法。

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

基于客户端操作系统的C#分支代码

是的,只写

OSThingy runningOS;

没有理由在这里使用dynamic

您的实现中似乎有一些方法(在接口上定义)没有在OSThingy上定义。在我看来,关于如何进行,你有几个选择。

1.将接口方法移动到OSThingy

如果您的接口方法适用于每个OSThingy实现,那么在OSThingy上将这些方法定义为抽象方法,例如

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

2.创建一个从OSThingy派生的新基类

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

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

3.在适当的地方铸造

当您需要该类型的方法时,强制转换到您的接口/基类,例如

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

如果不能确定类型实现IWindowsOS,例如,则可以使用as运算符

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关键字的情况下,有很多可行的选项。

在这种情况下不应该声明dynamic(事实上,很少)。方法或实例与静态方法或实例之间的区别。默认情况下,类及其方法是非静态的(读:dynamic),除非您将它们声明为静态的。

在一个更IDE级别的层面上,VS有时会对我表现得有点好笑,Intellisense会随机退出工作。保存并重新启动VS为我修复了这个问题。

还有一点需要注意,如果你要在数量不确定的系统上使用它,而你不能绝对保证操作系统的版本,你也应该在代码中提供这一点。确保你也能适应小版本,因为有些人可能没有安装最新的service Pack,如果有5.3或5.2版本的人尝试使用它(以及Vista的6.x或Windows 8的8.x),那么只尝试使用5.1(SP1)会引发异常。

我在想,如果我将接口应用于"OSThingy"类将dynamic替换为"OSThingy",我至少会获得Intellisense方法和属性,但不确定这是否是正确的方法。

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

顺便说一句,您不必在这里使用接口,您已经有了一个基类,可以使用OSThingy