0

私はスクリプトのバックグラウンドから来て、いくつかの C# を一緒にハックしようとしています。したがって、この質問をどのように表現すればよいかわかりませんでしたが、間違いなく必要な OOP を理解していないため、質問していると確信しています。

基本的に私は3つのクラスを持っています:

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();

ただし、dynamic キーワードを使用しているため、Intellisense は機能しません。後で派生クラスの 1 つを使用するときに、Intellisense (少なくとも一部) を保持する方法はありますか?

「OSTThingy」クラスにインターフェイスを適用し、動的を「OSTThingy」に置き換えれば、少なくとも「OSTThingy」で定義されたメソッドとプロパティの Intellisense を取得できると考えていましたが、これが正しい方法であるかどうかはわかりませんそれ。

答えはイエスだと思いますが、Windows XP と Windows 7+ の間でコード パスを分岐するより良い方法はありますか?

4

4 に答える 4

3

はい、ただ書いてください

OSThingy runningOS;

ここを使う理由はありませんdynamic

于 2013-06-23T22:38:24.310 に答える
0

で定義されていない実装 (インターフェースで定義されている) にいくつかのメソッドがあるようですOSThingy。ご覧のとおり、続行する方法にはいくつかの選択肢があります。

1. インターフェイス メソッドを次の場所に移動します。OSThingy

インターフェイス メソッドがすべてOSThingyの実装に適用できる場合は、メソッドを抽象 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

この状況では、dynamic を宣言するべきではありません (実際、非常にまれです)。違いは、メソッドまたはインスタンスと静的メソッドまたはインスタンスの間です。デフォルトでは、静的と宣言しない限り、クラスとそのメソッドは非静的 (つまり、動的) です。

より IDE レベルで物事を見ると、VS が少しおかしくなり、Intellisense がランダムに動作しなくなります。VSを保存して再起動すると、これが修正されます。

もう 1 つ注意してください。OS のバージョンを完全に保証できない不確定な数のシステムでこれを使用する場合は、コードでもそれを提供する必要があります。一部の人々は最新のサービス パックをインストールしていない可能性があり、5.3 または 5.2 の誰かがそれを使用しようとすると (SP1 だけでなく) 例外がスローされるため、マイナー バージョンにも対応するようにしてください。 Vista の場合は x、Windows 8 の場合は 8.x)

于 2013-06-23T22:46:25.460 に答える
0

「OSTThingy」クラスにインターフェイスを適用し、動的を「OSTThingy」に置き換えれば、少なくとも「OSTThingy」で定義されたメソッドとプロパティの Intellisense を取得できると考えていましたが、これが正しい方法であるかどうかはわかりませんそれ。

これはまさに行くべき道です!クラス/インターフェースを継承する主な利点の 1 つは、同じベースの複数の実装を作成でき、それらを使用する際に詳細を気にする必要がないことです。後で特定の子クラスにのみ属する特定のメソッド/プロパティが必要な場合は、対応する型にキャストするだけです。絶対に必要でない限り、私はdynamic完全に避けようとします。

ところで、ここでインターフェイスを使用する必要はありません。使用できる基本クラスが既にあります。OSThingy

于 2013-06-23T22:46:51.520 に答える