У меня есть базовый и производный класс:
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()
из производного класса и в базовый класс, чтобы я не дублировал этот код в каждом производном классе.
Я не могу понять, как это сделать, потому что статический метод в базовом классе не имеет понятия, какой тип объекта для нового.
Итак, есть ли способ сделать то, что я пытаюсь сделать, поддерживая статическое взаимодействие с классом, избегая при этом дублирования кода, чтобы это произошло?
Если вы работаете со статическими данными, возможно, вам нужны одиночные объекты, которые могут быть созданы только один раз. Они имеют преимущество поддержки наследования и реализации интерфейса, а также становятся доступными статически. Кроме того, в отличие от статических классов, они могут передаваться в качестве аргументов методам и сохраняться в полях, свойствах и переменных.
Вы можете использовать свойства вместо методов 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 в С# для различных способов реализации одноэлементного шаблона.
Во-первых, я не совсем уверен, что именно вы пытаетесь выполнить. Поэтому я не комментирую, если это хорошая идея. Вы можете получить поведение, которое действует как переопределенные методы на базовых классах со статикой. Вместо этого вы перезаписываете базу, а затем вызываете ее. Я делаю что-то подобное этому для извлечения экземпляров или коллекций экземпляров из класса:
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;
}
}
static interface
? И из того, что я могу сказать из вашего примера, вы не хотите / не должны использовать какие-либо статические методы вообще. Придерживайтесь экземпляров.