То, чтобы заставлять суперкласс иметь статическую переменную это отличается для каждого подкласса в c#

Я в настоящее время требую, чтобы это запустило основанное на Eclipse приложение, но я должен установить некоторые переменные сначала, который локален для того приложения. sc.exe только позволит исполняемые файлы, но не сценарии, таким образом, я обратился к autoexnt.exe, который является частью набор ресурса Windows 2003 . Это ограничивает сервис файлом единого пакета, но мне только нужен один сценарий пакетной обработки, который будет преобразован на службу.

чао!

7
задан Community 23 May 2017 в 12:00
поделиться

3 ответа

Хотя это нормально работает, мне интересно, есть ли более элегантный или встроенный способ сделать это?

На самом деле нет встроенного способа сделать это, поскольку вы здесь как бы нарушаете основные принципы объектно-ориентированного программирования. Ваш базовый класс не должен иметь никаких знаний о подклассах в традиционной объектно-ориентированной теории.

При этом, если вы должны это сделать, ваша реализация, вероятно, будет настолько хороша, насколько вы собираетесь получить, если вы не можете добавить какую-либо другую информацию к подклассам напрямую. Если вам нужно контролировать это, и вы не можете изменять подклассы, это, вероятно, будет вашим лучшим подходом.

6
ответ дан 6 December 2019 в 21:14
поделиться

Это немного отличается от того, о чем вы просите, но, возможно, дает то же самое.

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine((new B()).theValue);
            Console.WriteLine((new C()).theValue);
            Console.ReadKey();
        }
    }

    public abstract class A
    {
        public readonly string theValue;

        protected A(string s)
        {
            theValue = s;
        }
    }

    public class B : A
    {
        public B(): base("Banana")
        {
        }
    }

    public class C : A
    {
        public C(): base("Coconut")
        {
        }
    }
2
ответ дан 6 December 2019 в 21:14
поделиться

Существует альтернативное решение, которое может быть лучше вашего, а может и не быть, в зависимости от варианта использования :

abstract class ClassA
{
    private static class InternalClass<T> {
        public static string Value;
    }
    public string GetValue()
    {
        return (string)typeof(InternalClass<>)
              .MakeGenericType(GetType())
              .GetField("Value", BindingFlags.Public | BindingFlags.Static)
              .GetValue(null);
    }
}

Этот подход используется в EqualityComparer .Default . Конечно, для этой задачи он не используется. Вам действительно стоит подумать о том, чтобы сделать GetValue абстрактным и переопределить его в каждом производном классе.

0
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

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