클래스 이름에 대한 별칭을 만들고 싶습니다. 다음 구문은 완벽합니다.
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
에서 상속 할 클래스 를 만드는 것이 었습니다 .Outlook2003
Outlook2007
public static class ColorScheme : Outlook2007ColorScheme
{
}
그러나 정적 클래스에서 상속 할 수 없습니다.
내 다음 생각은 정적 ColorScheme
클래스 를 만드는 것이 었지만 make Outlook2003ColorScheme
및 Outlook2007ColorScheme
클래스는 비 정적이었습니다. 그러면 정적 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 #에서 클래스 이름의 별칭을 지정 하지 않고 수행 할 수있는 작업이 있습니다 .
- 에 따라 변화 모두
ColorScheme
에using
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;
좋습니다.