100

クラス名のエイリアスを作成したい。次の構文は完璧です。

public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName
{
   ...
}

public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName;

しかし、それはコンパイルされません。


この例は、便宜上のみ提供されています。システム全体の設計を変更することを提案して、この特定の問題を解決しようとしないでください。この例の存在または欠如は、元の質問を変更しません。

一部の既存のコードは、静的クラスの存在に依存しています。

public static class ColorScheme
{
   ...
}

この配色は、Outlook 2003 の配色です。Outlook 2003 の配色を維持しながら、Outlook 2007 の配色を導入したい:

public static class Outlook2003ColorScheme
{
   ...
}

public static class Outlook2007ColorScheme
{
   ...
}

しかし、コードが という静的クラスの存在に依存しているという事実にまだ直面していますColorScheme。私の最初の考えは、またはのいずれかColorSchemeから継承するクラスを作成することでした:Outlook2003Outlook2007

public static class ColorScheme : Outlook2007ColorScheme
{
}

ただし、静的クラスから継承することはできません。

次に考えたのは、静的ColorSchemeクラスを作成することでしたがOutlook2003ColorSchemeOutlook2007ColorSchemeクラスを非静的にしました。次に、静的ColorSchemeクラスの静的変数は、「真の」配色のいずれかを指すことができます。

public static class ColorScheme
{
    private static CustomColorScheme = new Outlook2007ColorScheme();
    ...
}

private class CustomColorScheme 
{ 
   ...
}

private class Outlook2008ColorScheme : CustomColorScheme 
{
    ...
}

private class Outlook2003ColorScheme : CustomColorScheme 
{
   ...
}

しかし、そのためには、読み取り専用の静的な Color だけで構成されたクラスをオーバーライド可能なプロパティに変換する必要があり、そのColorSchemeクラスでは、含まれるオブジェクトに 30 の異なるプロパティ ゲッターをサンクする必要があります。

それはタイピングしすぎです。

だから私の次の考えは、クラスをエイリアスすることでした:

public static ColorScheme = Outlook2007ColorScheme;

しかし、それはコンパイルされません。

静的クラスを別の名前にエイリアスするにはどうすればよいですか?


更新:誰かが「C#ではこれを行うことはできません」という回答を追加してください。受け入れられた回答としてマークできます。同じ質問に対する回答が必要な人は、この質問、受け入れられた回答、および役立つ場合とそうでない場合があるいくつかの回避策を見つけることができます。

この質問は締め切りたいと思います。

4

11 に答える 11

144

できません。次善の策は、クラスを使用するファイルに宣言を含めることです。using

たとえば、インポート エイリアスを (準typedef代替として)使用して依存コードを書き直すことができます。

using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;

残念ながら、これは名前を使用するすべてのスコープ/ファイルに入る必要があります。

したがって、これがあなたの場合に実用的かどうかはわかりません。

于 2008-10-28T18:12:02.990 に答える
25

次のコード行を追加して、クラスのエイリアスを作成できます。

using Outlook2007ColorScheme = YourNameSpace.ColorScheme;
于 2008-10-28T18:19:52.460 に答える
15

C#でクラス名をエイリアスすることはできません。

C#でクラス名をエイリアシングしないでできることがあります。

ただし、元の質問に答えるには、C#でクラス名をエイリアスすることはできません。


更新:人々はなぜusing機能しないのか混乱しています。例:

Form1.cs

private void button1_Click(object sender, EventArgs e)
{
   this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor);
}

ColorScheme.cs

class ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

そして、すべてが機能します。今、私は新しいクラスを作成し、それにエイリアス ColorSchemeを付けたいと思います(コードを変更する必要がないように):

ColorScheme.cs

using ColorScheme = Outlook2007ColorScheme;

class Outlook2007ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

ああ、ごめんなさい。このコードはコンパイルされません:

ここに画像の説明を入力してください

私の質問は、C#でクラスをエイリアスする方法でした。できません。C#でクラス名をエイリアシングしないことができることがあります:

  • 代わりに依存するすべての人を変更ColorSchemeusing ColorSchemeます(エイリアスできないため、コード変更の回避策)
  • ファクトリパターンを使用することに依存しているすべての人をColorSchemeポリモーフィッククラスまたはインターフェイスに変更します(エイリアスできないため、コード変更の回避策)

ただし、これらの回避策には、既存のコードを壊すことが含まれます。オプションではありません。

人々がクラスの存在に依存している場合ColorScheme、私は実際にクラスをコピーして貼り付ける必要がありますColorScheme

言い換えると、C#でクラス名をエイリアスすることはできません。

これは、エイリアスを定義できる他のオブジェクト指向言語とは対照的です。

ColorScheme = Outlook2007ColorScheme

そして、私は終わります。

于 2009-01-12T19:08:57.380 に答える
12

要件に応じて、( Factory | Singleton ) が必要です。前提は、クライアント コードがどのカラー スキームを取得しているかを知る必要がないようにすることです。配色がアプリケーション全体である必要がある場合は、シングルトンで問題ありません。さまざまな状況で別のスキームを使用する可能性がある場合は、おそらく Factory パターンが適しています。いずれにせよ、配色を変更する必要がある場合は、コードを 1 か所変更するだけで済みます。

public interface ColorScheme {
    Color TitleBar { get; }
    Color Background{ get; }
    ...
}

public static class ColorSchemeFactory {

    private static ColorScheme scheme = new Outlook2007ColorScheme();

    public static ColorScheme GetColorScheme() { //Add applicable arguments
        return scheme;
    }
}

public class Outlook2003ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.LightBlue; }
   }

    public Color Background {
        get { return Color.Gray; }
    }
}

public class Outlook2007ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.Blue; }
   }

    public Color Background {
        get { return Color.White; }
    }
}
于 2008-10-28T18:15:34.043 に答える
11

これを試して:

using ColorScheme=[fully qualified].Outlook2007ColorScheme
于 2008-10-28T18:12:59.917 に答える
7

OPが「回答」を受け入れてからずっと後にこれを見つけたユーザーのために、このコメントを追加しています。C# でのエイリアスは、完全修飾名前空間を使用してクラス名を指定することで機能します。定義されたエイリアス名は、そのスコープ内で使用できます。例。

using aliasClass = Fully.Qualified.Namespace.Example;
//Example being the class in the Fully.Qualified.Namespace

public class Test{

  public void Test_Function(){

    aliasClass.DoStuff();
    //aliasClass here representing the Example class thus aliasing
    //aliasClass will be in scope for all code in my Test.cs file
  }

}

すぐに入力されたコードで申し訳ありませんが、ユーザーが C# では実行できないと誤解しないように、これを実装する方法を説明していただければ幸いです。

于 2017-11-21T18:23:16.733 に答える
4

やりたい方法でのエイリアスは、C# では機能しません。これはusing、問題のファイル/名前空間に限定されたディレクティブを介してエイリアシングが行われるためです。古いクラス名を使用するファイルが 50 個ある場合、50 個の場所を更新することになります。

とはいえ、コードの変更を最小限に抑える簡単な解決策があると思います。実装ColorSchemeを使用してクラスを実際のクラスへの呼び出しのファサードにしusing、そのファイル内の を使用して、使用するものを決定しColorSchemeます。

つまり、次のようにします。

using CurrentColorScheme = Outlook2007ColorScheme;
public static class ColorScheme
{
   public static Color ApplyColorScheme(Color c)
   {
       return CurrentColorScheme.ApplyColorScheme(c);
   }
   public static Something DoSomethingElse(Param a, Param b)
   {
       return CurrentColorScheme.DoSomethingElse(a, b);
   }
}

次に、コード ビハインドで何も変更しません。

private void button1_Click(object sender, EventArgs e)
{
   this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor);
}

ColorSchemeその後、 1 行のコードを更新することで の値を更新できます ( using CurrentColorScheme = Outlook2008ColorScheme;)。

ここでいくつかの懸念があります。

  • ColorSchemeすべての新しいメソッドまたはプロパティ定義は、クラスとクラスの 2 つの場所に追加する必要がありますOutlook2007ColorScheme。これは余分な作業ですが、これが真のレガシー コードである場合は、頻繁に発生するべきではありません。おまけとして、コードColorSchemeは非常に単純であるため、バグの可能性は非常に明白です。
  • この静的クラスの使用は、私には自然に思えません。おそらくレガシーコードをリファクタリングしてこれを別の方法で実行しようとするでしょうが、あなたの状況がそれを許さない可能性があることも理解しています.
  • 置き換えるクラスが既にColorSchemeある場合は、このアプローチやその他の方法が問題になる可能性があります。そのクラスの名前を のような名前に変更しColorSchemeOld、 からアクセスすることをお勧めしますusing CurrentColorScheme = ColorSchemeOld;
于 2015-02-28T22:08:49.987 に答える
2

インターフェイスを使用するように変更することはできますか?

IColorSchemeおそらく、すべてのクラスが実装するインターフェイスを作成できますか?

これは、Chris Marasti-Georg が示すように、ファクトリ パターンでうまく機能します。

于 2008-10-28T18:18:27.703 に答える
0

それは非常に遅い部分的な答えです-しかし、同じ名前空間「Outlook」で同じクラス「ColorScheme」を定義するが、別々のアセンブリで、1つはOutlook2003と呼ばれ、もう1つはOutlook2007である場合、必要なことは適切なアセンブリを参照することだけです.

于 2015-08-31T15:53:34.560 に答える