Добавление члена данных в уже существующий класс в C#
Я читал о методах расширения и о том, как они могут расширять классы новыми методами без необходимости изменения определения кода класса. Я хотел знать, существует ли какой-либо аналогичный способ, которым я могу добавить новый элемент данных (например, список или массив) в существующий класс и использовать член данных для хранения информации, связанной с классом?
6 ответов
Нет способа прямого добавления членов к определенному классу. Если класс не sealed
вы можете расширить этот класс, используя inheritance
, Если это sealed
Вы можете составить себе новый класс, который инкапсулирует определенный класс, который вы хотели расширить, и расширить реализацию.
Например, если у вас есть MyClass
который не запечатан, и вы хотите расширить его, просто наследуйте:
public class MyExtendedClass : MyClass
{
// Add extra logic
}
или, что касается составления нового класса самостоятельно, вы можете сделать следующее:
public class MyExtendedClass
{
private MyClass _class;
public string MyExtraString { get; set; }
}
Да, вы можете расширить этот класс, используя наследование.
public class MyClass
{
...
}
public ExtendedClass: MyClass
{
public int ExtraField {get; set;}
}
Таким образом, у вас есть все члены и методы (кроме приватных), которые существуют на базе.
С помощью методов расширения вы можете только расширить функциональность класса.
То, что вы ищете, можно решить с помощью:
- Агрегация ИЛИ
- наследование
Этот пост может помочь вам решить, какой из них использовать в вашем случае: Наследование против агрегации
Хотя другие ответы кажутся правильными, ответ на ваш вопрос ИМХО состоит в том, что невозможно расширить существующий класс новыми свойствами так, как это делают методы расширения. После того, как класс определен, вы не можете "добавлять" к нему вещи.
Метод расширения является исключением, поскольку это просто синтаксический сахар для статического вспомогательного класса.
Ты можешь использовать inheritance
или же composition
для этого.
Пример наследования:
public class Student
{
int age;// all props
}
public class MAStudent : Student // MSStudent is a student with extra stuff.
{
float maAverage;
}
Пример композиции:
public class Student
{
int age;// all props
}
public class MAStudent
{
Student student;
float maAverage;
// use student's functions inside the class
}
Наследование - это самый простой способ сделать что-то.
Проблема в том, что это делает ваши классы связанными.
Хороший перк с наследованием, что вы можете получить доступ к любому защищенному + свойству \ методу.
Также вы можете написать что-то на основе таких методов расширения, как это
public class ExistingClass
{
}
public static class ExtendingExistingClass
{
private static Dictionary<ExistingClass,List> _values = new Dictionary<ExistingClass,List>();
public List GetMyNewField(this ExistingClass t)
{
List res = null;
_values.TryGetValue(t, out res);
return res;
}
public void SetMyNewField(this ExistingClass t, List value)
{
_values[t] = value;
}
}