[c#] 클래스를 사용하는 모든 파일에 한 줄의 코드를 추가하지 않고 C #에서 클래스 이름의 별칭을 어떻게 지정합니까?

클래스 이름에 대한 별칭을 만들고 싶습니다. 다음 구문은 완벽합니다.

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클래스 를 만드는 것이 었지만 make Outlook2003ColorSchemeOutlook2007ColorScheme클래스는 비 정적이었습니다. 그러면 정적 ColorScheme클래스 의 정적 변수가 “true”색 구성표를 가리킬 수 있습니다.

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

private class CustomColorScheme
{
   ...
}

private class Outlook2008ColorScheme : CustomColorScheme
{
    ...
}

private class Outlook2003ColorScheme : CustomColorScheme
{
   ...
}

하지만 그렇게하려면 읽기 전용 정적 색상으로 구성된 클래스를 재정의 가능한 속성으로 변환 한 다음 ColorScheme 해야합니다. 클래스에서 30 개의 서로 다른 속성 게터를 포함 된 개체 해야합니다.

그것은 너무 많은 타이핑입니다.

그래서 다음 생각은 클래스의 별칭을 지정하는 것이 었습니다.

public static ColorScheme = Outlook2007ColorScheme;

그러나 그것은 컴파일되지 않습니다.

정적 클래스를 다른 이름으로 어떻게 별칭을 지정할 수 있습니까?


업데이트 : 누군가 “You can do this in C #” 를 추가해 주시면 수락 된 답변으로 표시 할 수 있습니다. 동일한 질문에 대한 답변을 원하는 다른 사람은이 질문, 허용 된 답변 및 유용 할 수도 있고 아닐 수도있는 여러 해결 방법을 찾을 수 있습니다.

이 질문을 종료하고 싶습니다.



답변

당신은 할 수 없습니다 . 당신이 할 수 있는 차선책 은using 클래스를 사용하는 파일에 선언을하는 것입니다.

예를 들어, 가져 오기 별칭을 사용하여 종속 코드를 다시 작성할 수 있습니다 (준 typedef대체).

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

불행히도 이것은 이름을 사용하는 모든 범위 / 파일에 들어가야합니다.

따라서 이것이 귀하의 경우에 실용적인지 모르겠습니다.


답변

다음 코드 줄을 추가하여 클래스의 별칭을 만들 수 있습니다.

using Outlook2007ColorScheme = YourNameSpace.ColorScheme;


답변

요구 사항에 따라 ( Factory | Singleton )을 원합니다 . 전제는 클라이언트 코드가 어떤 색 구성표를 얻고 있는지 알 필요가 없도록 만드는 것입니다. 색 구성표가 적용 범위가 넓어야한다면 싱글 톤이 좋습니다. 다른 상황에서 다른 체계를 사용할 수 있다면 팩토리 패턴을 사용하는 것이 좋습니다. 어느 쪽이든 색 구성표를 변경해야 할 때 코드를 한 곳에서만 변경하면됩니다.

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; }
    }
}


답변

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

그리고 나는 끝날 것입니다.


답변

이 시도:

using ColorScheme=[fully qualified].Outlook2007ColorScheme


답변

나는 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 #에서 수행 할 수 없다고 사용자가 오해하지 않도록이를 구현하는 방법을 설명합니다.


답변

원하는 방식으로 별칭을 지정하면 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한 줄의 코드 ( using CurrentColorScheme = Outlook2008ColorScheme;) 를 업데이트하여의 값을 업데이트 할 수 있습니다 .

여기에 몇 가지 우려 사항이 있습니다.

  • 그런 다음 모든 새 메서드 또는 속성 정의를 ColorScheme클래스와 클래스의 두 위치에 추가해야합니다 Outlook2007ColorScheme. 이것은 추가 작업이지만 이것이 진정한 레거시 코드라면 자주 발생해서는 안됩니다. 보너스로ColorScheme 는 매우 간단하여 가능한 버그가 매우 분명합니다.
  • 이 정적 클래스의 사용은 나에게 자연스럽지 않은 것 같습니다. 나는 이것을 다르게하기 위해 레거시 코드를 리팩토링하려고 할 것이다. 그러나 나는 당신의 상황이 그것을 허용하지 않을 수도 있다는 것도 이해한다.
  • ColorScheme대체 할 클래스가 이미있는 경우이 접근 방식과 다른 모든 것이 문제가 될 수 있습니다. 이 클래스의 이름을 다음과 같이 변경 ColorSchemeOld한 다음을 통해 액세스하는 것이 using CurrentColorScheme = ColorSchemeOld;좋습니다.