Как я искажаю имя класса в C#, не имея необходимость добавлять строку кода к каждому файлу, который использует класс?

71
задан ToolmakerSteve 29 December 2018 в 22:00
поделиться

7 ответов

Вы не можете исказить имя класса в 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) { ... }
}

Ohh, я сожалею. Этот код не компилирует:

enter image description here

Мой вопрос состоял в том как к [1 114] псевдоним класс в C#. Это не может быть сделано. Существуют вещи, которые я могу сделать, которые являются не искажение имени класса в C#:

  • изменение все, кто зависит от ColorScheme к using ColorScheme вместо этого (обходное решение изменения кода, потому что я не могу исказить)
  • изменение все, кто зависит от ColorScheme для использования шаблона "фабрика" их полиморфный класс или интерфейс (обходное решение изменения кода, потому что я не могу исказить)

, Но эти обходные решения включают повреждающийся существующий код: не опция.

, Если люди зависят от присутствия ColorScheme класс, я имею к на самом деле скопировать/вставить ColorScheme класс.

, Другими словами: я не могу исказить имя класса в C#.

Это контрастирует с другими объектно-ориентированными языками, где я мог определить псевдоним:

ColorScheme = Outlook2007ColorScheme

и я был бы сделан.

11
ответ дан Ian Boyd 24 November 2019 в 12:55
поделиться

При изменении исходного имени класса Вы могли бы переписать зависимый код с помощью псевдонима импорта в качестве typedef замена:

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

Это должно пойти наверху файла/пространства имен, точно так же, как регулярный using с.

я не знаю, практично ли это в Вашем случае, все же.

112
ответ дан Konrad Rudolph 24 November 2019 в 12:55
поделиться

Можно сделать псевдоним для класса путем добавления этой строки кода:

using Outlook2007ColorScheme = YourNameSpace.ColorScheme;
22
ответ дан mohammedn 24 November 2019 в 12:55
поделиться

Вы хотите ( Фабрика | 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; }
    }
}
13
ответ дан Chris Marasti-Georg 24 November 2019 в 12:55
поделиться

Действительно ли возможно измениться на использование интерфейса?

, Возможно, Вы могли создать IColorScheme интерфейс, который реализуют все классы?

Это работало бы хорошо с шаблоном "фабрика" как показано Chris Marasti-Georg

2
ответ дан Ian Boyd 24 November 2019 в 12:55
поделиться

попробуйте это:

using ColorScheme=[fully qualified].Outlook2007ColorScheme
10
ответ дан Ian Boyd 24 November 2019 в 12:55
поделиться

В то время как функциональность, которую Вы просите, не существует, и мой ответ не отвечает на Ваш вопрос по сути, возможно оставить класс ColorScheme неповрежденным и метка с Устаревший атрибут, затем добавить другие два новых класса цветовой схемы.

Это не потребовало бы никаких системных изменений и сохраняет obsoleted класс изолированным.

0
ответ дан 24 November 2019 в 12:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: