2013-06-23 3 views
0

Я исхожу из сценариев, пытаясь взломать некоторые C# вместе. Поэтому я не был уверен, как сформулировать этот вопрос, но я уверен, что я спрашиваю об этом, потому что у меня нет понимания ООП, в котором я, без сомнения, нуждаюсь!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», я бы хотя бы получил Intellisense для методов и свойств, определенных в «OSThingy», но не уверен, что это правильно путь к этому.

Я уверен, что ответ да, но есть ли лучший способ разветвления кодов между Windows XP и Windows 7+?

ответ

0

Оказывается, у вас есть какие-то методы ваших реализаций (определенные в интерфейсе), который не определены на 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. Cast в соответствующих случаях

Cast на свой интерфейс/базовый класс, когда вам нужны методы этого типа, например,

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

Спасибо, Луказид! Это действительно исчерпывающее объяснение. Наверное, у меня есть несколько вариантов! – Timothy

3

Да, просто написать

OSThingy runningOS; 

Там нет причин, чтобы использовать dynamic здесь.

0

Вы не должны декларировать динамику в этой ситуации (на самом деле, очень редко). Дифференциация между методом или экземпляром и статическим методом или экземпляром. По умолчанию классы и их методы нестатические (read: dynamic), если вы не объявляете их статическими.

На более IDE уровне, глядя на вещи, VS иногда действует немного смешно со мной, и Intellisense будет случайным образом прекращать работу. Сохранение и перезапуск VS исправляет это для меня.

Еще одно замечание: если вы собираетесь использовать это в неопределенном количестве систем, где вы не можете абсолютно гарантировать версию ОС, вы также должны указать это в своем коде. Удостоверьтесь, что вы размещаете и для второстепенных версий, так как некоторые люди могут не устанавливать последние пакеты обновлений, и только попытка попасть в 5.1 (SP1) приведет к исключению, если кто-то с 5.3 или 5.2 попытается его использовать (а также 6. х для Vista, или 8.x для Windows 8)

+0

Привет, Майк, спасибо за ваш комментарий. FYI, моя тестовая система XP - SP3, но возвращает номер версии 5.1. Я считаю, что 5.1.2600 XP SP3. – Timothy

+0

Интересно, я этого не знал. Вы могли бы подумать, что они будут использовать 5.1.xxxx для обозначения выпущенных второстепенных патчей. Хороший 'ol Microsoft, никогда не делая смысла haha ​​ – mikedugan

0

Я думаю, если я применил интерфейс к классу «OSThingy» и заменить динамический с «OSThingy», я бы по крайней мере, получить Intellisense для методов и свойства, определенные в «OSThingy», но не уверены, что это правильный путь.

Это точно путь!Это одно из основных преимуществ наследования класса/интерфейса, что вы можете создавать несколько реализаций одной и той же базы и не заботятся об особенностях при их использовании. Если вам понадобятся некоторые конкретные методы/свойства, принадлежащие только определенному дочернему классу, все, что вам нужно, это передать его соответствующему типу. Я бы старался избегать dynamic вообще, если только не обязательно.

Кстати, вы не должны использовать интерфейс здесь, у вас уже есть базовый класс, который вы можете использовать OSThingy

+0

Спасибо Walther за подсказку. Я думаю, что избегать динамичного пути! :) – Timothy

Смежные вопросы