c # свойство override метод Set - PullRequest
       1

c # свойство override метод Set

4 голосов
/ 02 декабря 2010

У меня есть класс, подобный приведенному ниже, я хочу переопределить установленное значение свойства "School, Country..etc ..", когда кто-то устанавливает значение, я не хочу менять класс ученика, но мне нужно сделать это в базовом классе и использовать его как универсальный метод

public class Student : BaseClass
{
       public String School { get; set; }
       public String Country{ get; set; }
}

, а именно: Когда кто-то устанавливает Student.School="Harvard", Мне нужно хранить его как
Student.School="Harvard my custom value";

Примечание: В основном вызов OnPropertyChanged в базовом классе , а не в основном классе.

Ответы [ 5 ]

1 голос
/ 02 декабря 2010

Если вы хотите сделать это с аспектами, попробуйте Postsharp

0 голосов
/ 02 декабря 2010

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

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

Однако, если вы не можете переместить их в базовый класс и не можете изменить класс Student, как вы, вероятно, подразумеваете в своем вопросе, тогда вы можете инкапсулировать класс Student в новый класс, такой как StudentProxy или что-то еще, и затем получить его. выставляйте похожие свойства, которые затем будут вызывать реальный ученический класс так, как вы хотите.

Например:

public class StudentProxy
{
    private Student _student;

    public StudentProxy(Student student)
    {
        this._student = student;
    }

    public String School
    {
        get { return _student.School; }
        set
        {
            _student.School = value + "  my custom value";
        }
    }

    public String Country
    {
        get { return _student.Country; }
        set
        {
            _student.Country = value + "  my custom value";
        }
    }
}
0 голосов
/ 02 декабря 2010
public class Student : BaseClass
{
    private string _school
    public string School 
    {
        get { return _school; }
        set
        {
            if(value == "Harvard")
                value = "Harvard custom";

            _school = value;
        }
    }

    public String Country{ get; set; }
}

это то, что вы имеете в виду?

Если свойство School находится в BaseClass, то вы можете использовать ключевое слово new или если вы контролируете BaseClass,затем вы можете добавить ключевое слово virtual к свойству School и override в классе Student.

0 голосов
/ 02 декабря 2010

Это просто невозможно сделать, просто изменив BaseClass. Подумайте об этом следующим образом: если бы можно было легко «аннотировать» автоматические свойства, то нам не понадобились бы все эти бесполезные тонны реализаций свойств вручную для классов модели данных, которые реализуют INotifyPropertyChanged (то же самое для DependencyProperties ).

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

public class Student : BaseClass
{
   private string _school;
   public String School 
   {
       get { return _school; }
       set {
            _school = value;
            DoMoreChanges(ref _school);  // DoMoreChanges is defined in BaseClass
       }
   }

   public String Country{ get; set; }
}

Если у вас есть много подклассов, которым это необходимо, вы можете использовать фрагменты кода Visual Studio для создания кода или шаблоны T4 .

0 голосов
/ 02 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...