0

我来自脚本背景,试图一起破解一些 C#。所以我不知道如何表达这个问题,但我确定我是在问这个问题,因为我不了解我无疑需要的 OOP!

基本上我有三个类:

class OSThingy
class XP : OSThingy
class Win7 : OSThingy

'OSTthingy' 类包含两个派生类都需要的通用属性和一些方法。每个派生类都实现了一个接口,该接口为它们提供了一些实现不同的通用方法。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();

但是,因为我使用的是 dynamic 关键字,所以 Intellisense 不起作用。当我稍后使用其中一个派生类时,是否有任何方法可以保留(至少部分)智能感知?

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

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

4

4 回答 4

3

是的,只要写

OSThingy runningOS;

没有理由在dynamic这里使用。

于 2013-06-23T22:38:24.310 回答
0

看来您的实现中有一些方法(在接口上定义)未定义在OSThingy. 正如我所看到的,你有几个如何继续的选择。

1. 将接口方法移至OSThingy

如果您的接口方法适用于每个OSThingy实现,则将方法定义为 abstract on 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();

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关键字的使用。

于 2013-06-23T22:53:29.913 回答
0

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

在更 IDE 级别的观察中,VS 有时对我来说有点滑稽,而 Intellisense 会随机停止工作。保存并重新启动 VS 为我解决了这个问题。

还有一点需要注意的是,如果您要在数量不确定的系统上使用它,而您不能绝对保证操作系统版本,那么您也应该在代码中提供这一点。确保您也适应次要版本,因为有些人可能没有安装最新的服务包,如果有人使用 5.3 或 5.2(以及 6. x 适用于 Vista,或 8.x 适用于 Windows 8)

于 2013-06-23T22:46:25.460 回答
0

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

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

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

于 2013-06-23T22:46:51.520 回答