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


87

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

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 #" 를 추가해 주시면 수락 된 답변으로 표시 할 수 있습니다. 동일한 질문에 대한 답변을 원하는 다른 사람은이 질문, 허용 된 답변 및 유용 할 수도 있고 아닐 수도있는 여러 해결 방법을 찾을 수 있습니다.

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


구현하고 싶지 않더라도 Chris의 대답을 받아들이는 것이 좋습니다.
devio

2
답이 아니라 해결 방법입니다. 대답은 당신이 할 수 없다는 것입니다. 적어도 누군가가 와서 그것을하기위한 실제 구문을 게시 할 때까지는 말입니다.
Ian Boyd

1
여기에 오는 사람에게는 가장 높은 평가를받은 댓글이 내가 작업중인 VS 2010 및 VS 2017 c # 프로젝트에서 잘 작동하기 때문에 허용되는 답변이 잘못되었습니다. 별칭을 설정할 때 클래스를 지정하려면 정규화 된 네임 스페이스를 사용해야하지만 일단 설정하면 별칭이 정의 된 범위 내에서 작동합니다.
J-Americano

나는 그가 찾고있는 것을 이해하기 전에 Ian의 대답과 그의 의견을 자세히 읽어야했습니다. 그는 클래스 를 참조하는 모든 파일의 맨 위에 추가하지 않고 한 곳에서 클래스 별칭을 선언하려고합니다 . 나는 이것을 지원 하는 강력한 유형의 언어를 알지 못합니다 . (누군가가 그러한 언어를 알고 있다면 그것에 대해 알고 싶습니다.) 나는 이것을 더 명확하게하기 위해 제목을 편집했습니다.
ToolmakerSteve dec

BTW, 비슷한 일을하려는 사람이라면 정의하는 클래스라면 C # 접근 방식은 interface모든 클래스가 구현 하는를 정의하는 것입니다. chills42의 답변 에서 언급했듯이 . 그런 다음 현재 상황 (예 : 플랫폼 / OS) 또는 구성 파일에 따라 해당 인터페이스를 구현하는 개체를 반환하는 "서비스"또는 "공장"을 정의 할 수 있습니다.
ToolmakerSteve dec

답변:


129

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

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

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

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

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


9
원래 클래스가 포함 된 파일의 맨 위에 올 수 있다면 좋을 것입니다. 그러나 using모든 깨진 코드에 추가해야합니다. 또한 값이 단일 별칭을 갖는 것을 부정하여 기존 ColorScheme클래스 의 모든 사용자를 변경없이 새 클래스를 사용하도록 전환 할 수 있습니다 . 즉, ColorScheme클래스를 다른 클래스 로 별칭을 지정하고 싶습니다 .
Ian Boyd 2011 년

동일한 것을 달성하고 상속으로 별칭을 전파하는 방법이 있습니까? 즉, MyClass를 확장하는 모든 클래스는 MyClass 소스 파일에 using 문을 추가하여 .Fully.Qualified ... ColorScheme 대신 ColorScheme을 사용할 수 있습니까?
Florian Burel

글쎄, 그것은 내 경우에 매우 실용적이었습니다. 마지막으로 C #은 내 파일 경로 그리기를 중지합니다.
ElDoRado1239

25

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

using Outlook2007ColorScheme = YourNameSpace.ColorScheme;

현재 컨텍스트에 'ColorScheme'이라는 이름이 존재하지 않습니다
Ian Boyd

7
Fully.Qualified.Namespace.Of.ColorScheme
Jamie Pate

C #에서는 이런 식으로 네임 스페이스 (클래스가 아님)에만 별칭을 지정할 수 있다고 생각했습니다. VB.Net에서는 Imports. 내가 잘못?
Nick

using예를 들어 자신의 클래스의 별칭이 필요한 경우와 같이 네임 스페이스 내에 지시문 을 넣는 경우 정규화 된 이름이 필요하지 않습니다 .
Elvedin Hamzagic

12

요구 사항에 따라 ( 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; }
    }
}

이것은 공장이 아닌 싱글 톤 패턴에 대한 약한 시도처럼 보입니다. 공장은 생성 방법을 매개 변수화 할 가능성이 더 높습니다. 다음과 같은 것이 있습니다. public static ColorScheme GetColorScheme (string descriptor);
OwenP

사실-기본 아이디어는 Office 2012가 나올 때보 다 코드를 한 곳에서만 변경하면되는 것입니다.
Chris Marasti-Georg

1
이것은 확실히 작동하지만 확실히 간단한 문제에 대한 엔터프라이즈 급 솔루션입니다.
Ian Boyd

11

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

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


21
절대적으로 C #에서 클래스 이름의 별칭을 지정할 수 있습니다. "using <alias_name> = <fully_qualified_name>;"
clemahieu jul.

7
LIke @clemahieu는 클래스 이름을 절대적으로 별칭으로 지정할 수 있으며 정규화 된 이름을 사용해야합니다. 또한 일반 클래스의 별칭을 지정하는 경우 일반 클래스 한정자를 추가해야 할 수 있습니다. 예 : using ShortName = MyNamespace.SubNamespace.GenericClass <MyType>;
Dan Morphis 2011 년

11
반대 투표- "C #에서는 클래스 이름에 별칭을 지정할 수 없습니다."라고 말했습니다. 할 수 있습니다. 당신이 할 수없는 것은 당신이 원하는 방식으로 클래스의 별칭을 지정하는 것 입니다. 이것은 매우 정당한 요구 사항이지만 당신의 진술은 틀 렸습니다.
Tom W

8
여러 포스터에서 지적했듯이 정규화 된 이름을 사용하는 것이 앨리어싱을 금지하는 것은 아닙니다. 클래스의 별칭을 지정할 수 있습니다 . 이렇게하려면 정규화 된 이름을 사용해야합니다. 이것은 불편할 수 있지만 'C #에서 클래스 이름의 별칭을 지정할 수 없습니다'라는 문을 참으로 만들지 않습니다. 아마도 C #에서 앨리어싱이 작동하는 방식이 예상했던 것과 다를 수 있습니다. 괜찮습니다. 그럴 경우 말씀해주세요. 하지만 당신은 할 수 있습니다 사양 상태는 그렇게 할 수 있기 때문에이 제공하는 정의에 따라, C #에서 클래스 이름을 별칭.
Tom W

5
저는 프로그래머들이 줄 사이에 우리의 진술을하는 방식이 마음에 듭니다. Ian이 진정으로 말하는 것은 C #은 누구나하고 싶은 간단한 기본적인 일을 할 수없고 할 수 있어야하기 때문에 멍청하고 망가 졌다는 것입니다. 특정 의미론이 당신을 행복하게 만드는지 여부에 관계없이 그는 정확합니다.
IQpierce

10

이 시도:

using ColorScheme=[fully qualified].Outlook2007ColorScheme

현재 컨텍스트에 'ColorScheme'이라는 이름이 존재하지 않습니다
Ian Boyd

2
Fully.Qualified.Namespace.Of.ColorScheme
Jamie Pate

6

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


당신이 보여 경우에도 명확 것 선언 다른 클래스를 : namespace Fully.Qualified.Namespace{ public class Example {... public void DoStuff(){... }... } }.
ToolmakerSteve dec

1
분명히 이건 이안이 찾고있는 것과는 다릅니다. Ian은 클래스를 참조하는 소스 파일을 변경할 수 없거나 변경하고 싶지 않은 상황에 처해 있습니다. 그는 변화를 만드는 방법을 원합니다 자신의 응용 프로그램이나 라이브러리의 한 곳에서만 그 결과 원하는 이름을 가진 클래스처럼 보이는 것을 다른 모든 코드에서 사용할 수 있습니다 [여러 소스에 "using"문을 추가 할 필요없이 파일-예를 들어 소스를 변경할 수없는 경우].
ToolmakerSteve dec

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한 줄의 코드 ( using CurrentColorScheme = Outlook2008ColorScheme;) 를 업데이트하여의 값을 업데이트 할 수 있습니다 .

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

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

3

아무것도 추가하지 않고 항상 기본 클래스에서 상속 할 수 있다고 가정합니다.

public class Child : MyReallyReallyLongNamedClass {}

최신 정보

그러나 class자체 리팩토링 기능이있는 경우 : 클래스 이름은 일반적으로 namespaces 부족으로 인해 불필요하게 길어 집니다.

이 같은 사례를 참조하면 ApiLoginUser, DataBaseUser, WebPortalLoginUser, 부족의 표시 일반적으로 namespace인해 두려움 그 이름을 User힘 충돌.

그러나이 경우 위의 게시물에서 지적했듯이namespace alias 를 사용할 수 있습니다.

using LoginApi = MyCompany.Api.Login;
using AuthDB = MyCompany.DataBase.Auth;
using ViewModels = MyCompany.BananasPortal.Models;

// ...
AuthDB.User dbUser;
using ( var ctxt = new AuthDB.AuthContext() )
{
    dbUser = ctxt.Users.Find(userId);
}

var apiUser = new LoginApi.Models.User {
        Username = dbUser.EmailAddess,
        Password = "*****"
    };

LoginApi.UserSession apiUserSession = await LoginApi.Login(apiUser);
var vm = new ViewModels.User(apiUserSession.User.Details);
return View(vm);

어떻게 '주의 class이름을 모두 있습니다 User,하지만 서로 다른의 namespace의. PEP-20 인용 : Zen of Python :

네임 스페이스는 훌륭한 아이디어 중 하나입니다. 더 많은 작업을 수행해 보겠습니다!

도움이 되었기를 바랍니다


2
항상 당신이 할 수없는 한 : 밀봉 예를 들어 클래스
mikus

그러나 그것은 많은 경우에 작동하지 않을 것입니다. 예 : 공용 클래스 MyList : List {}-나중에 시도하는 경우 MyList xyz = something.ToList (); 당신은 막힐 것입니다.
Offler

@Offler new그러한 방법에 대한 키워드에 의지 하거나 자신의 ExtensionMethods를 생각 해낼 수도 있습니다. 어쨌든 사용자 정의 모델 / ViewModels / POCO와 함께 항상 바닐라 컬렉션 클래스 (예 : Dictionary, List, IEnumerable, IQueryable 등)를 사용해야한다는 것이 저의 강한 의견입니다.
Mvc가 말했듯

@percebus는 모든 경우에 작동하지 않습니다. 부품이 더 이상 지원되지 않는 API를 사용하는 빈티지 코드를 최신 코드로 변환하려고합니다. 지속 변환 코드는 다른 사람에 의해 변경되며 여전히 실행 가능해야합니다. 따라서 둘 다 지금 바로 사용할 수 있어야합니다. C ++ 스타일 별칭이 가능하다면 700.000 LOC (코멘트없이) 이상의 사물을 수렴하고 실행 가능하게하는 것이 더 쉬울 것입니다. 별칭 클래스를 둘 중 하나의 구현으로 대체하려면 파일에서 한 위치 만 필요합니다.
Offler

RE-POST for EDIT @Offler 인터페이스가있는 Factory처럼 필요한 사운드를 설명합니다. IColorScheme oColorScheme = ColorSchemeFactory.Create(); 또한, 조사 할 수 있습니다 의존성 삽입 (Dependency Injection)
percebus

2

인터페이스 사용으로 변경할 수 있습니까?

IColorScheme모든 클래스가 구현 하는 인터페이스를 만들 수 있습니까?

이것은 Chris Marasti-Georg가 보여주는 공장 패턴과 잘 작동합니다.


그럴 수도 있지만 사용할 "현재"색 구성표 인 클래스의 이름을 바꾸는 것보다 더 이상 시간을 낭비하지 않을 것입니다.
Ian Boyd

0

매우 늦은 부분 답변입니다. 그러나 동일한 네임 스페이스 'Outlook'에서 동일한 클래스 'ColorScheme'을 정의하지만 Outlook2003이라는 별도의 어셈블리와 다른 Outlook2007이라는 별도의 어셈블리를 정의하면 적절한 어셈블리를 참조하기 만하면됩니다. .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.