Можно ли перенести статический доступ в базовый класс?

1

У меня есть базовый и производный класс:

public abstract class MyBase
{
   protected string _data;
   protected string GetData_Internal() {return _data;}
   protected abstract void SetData(string data);
}

public class MyDerived : MyBase
{
   protected override void SetData(string data) {_data = "my data";}

   public static string GetData()
   {
      var instance = new MyDerived();
      return instance.GetData_Internal();
   }
}

Желаемое использование этого класса выглядит следующим образом:

string data1 = MyDerived.GetData();
string data2 = MyDerived2.GetData(); // another class dervied from MyBase

Я не могу сделать классы статичными, потому что статические классы и производные классы плохо взаимодействуют друг с другом. Поэтому я создал функцию GetData() static, и это позволяет мне использовать класс, как я хочу.

Я собираюсь иметь несколько классов, которые идентичны MyDerived, за исключением значений данных, установленных в SetData().

Я хотел бы переместить GetData() из производного класса и в базовый класс, чтобы я не дублировал этот код в каждом производном классе.

Я не могу понять, как это сделать, потому что статический метод в базовом классе не имеет понятия, какой тип объекта для нового.

Итак, есть ли способ сделать то, что я пытаюсь сделать, поддерживая статическое взаимодействие с классом, избегая при этом дублирования кода, чтобы это произошло?

  • 2
    Выберите статический или наследование; Вы не можете иметь оба.
  • 1
    Где static interface ? И из того, что я могу сказать из вашего примера, вы не хотите / не должны использовать какие-либо статические методы вообще. Придерживайтесь экземпляров.
Показать ещё 9 комментариев
Теги:

2 ответа

4
Лучший ответ

Если вы работаете со статическими данными, возможно, вам нужны одиночные объекты, которые могут быть созданы только один раз. Они имеют преимущество поддержки наследования и реализации интерфейса, а также становятся доступными статически. Кроме того, в отличие от статических классов, они могут передаваться в качестве аргументов методам и сохраняться в полях, свойствах и переменных.

Вы можете использовать свойства вместо методов getter и setter. Это упрощает ваш базовый класс:

public abstract class MyBase
{
    public string Data { get; set; }
}

Вы можете реализовать одноэлементный шаблон следующим образом:

public class MyDerived : MyBase
{
    #region Singleton Pattern

    public static readonly MyDerived Instance = new MyDerived();

    private MyDerived()
    {
    }

    #endregion
}

Создайте публичное статическое поле readonly, которое возвращает единственный экземпляр класса и сделает конструктор закрытым, чтобы запретить создавать экземпляры вне самого класса. Конструктор может также инициализировать значение Data если это необходимо.

Вы можете использовать синглтоны следующим образом:

MyDerived.Instance.Data = "my data";
string data = MyDerived.Instance.Data;

MyDerived2.Instance.Data = "my data 2";
...

См. Также: Реализация Singleton в С# для различных способов реализации одноэлементного шаблона.

0

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

public class Dog
{
    public static Dog GetById(int dogId) 
    { 
        //Return dog 
    }
}

public class Lab : Dog
{
    public new static Lab GetById(int dogId) 
    { 
        //Return same dog, as a lab 
    }
}

Быстрая и страшная, но, надеюсь, полезная версия может начаться следующим образом. Я мог бы сделать это во что-то практическое, если я понимаю ваши намерения немного лучше.

public abstract class MyBase
{
    public static string GetData()
    {
        return "BASE STUFF";
    }
}

public class MyDerivedA : MyBase
{
    protected const string MySpecialData = "AAAAAA";

    public new static string GetData()
    {
        return MyBase.GetData() + MySpecialData;
    }
}

public class MyDerivedB : MyBase
{
    protected const string MySpecialData = "BBBBBBB";

    public new static string GetData()
    {
        return MyBase.GetData() + MySpecialData;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню