Возможно ли это?
От: mrjeka Россия  
Дата: 14.09.09 12:18
Оценка:
Привет всем!

Ситуация


public class BaseClass
{
    public virtual string Prop1{get;set;}
}

public class ChildClass:BaseClass
{ 
    public override string Prop1
    {
      get{return "hello";}
      set{//Тут надо запретить изменять значение!}
    }
}



Как можно, и можно ли вообще, запретить изменять значение св-ва Prop1 в дочернем классе?
Необходимо это видеть на этапе компиляции, как например [Obsolete].
или еще лучше, если при создании объекта этого поля не будет видно вообще.
Re: Возможно ли это?
От: Пельмешко Россия blog
Дата: 14.09.09 12:31
Оценка:
Здравствуйте, mrjeka, Вы писали:

M>или еще лучше, если при создании объекта этого поля не будет видно вообще.


А я приведу к базовому типу и всё равно вызову сеттер
Бросайте в нём InvalidOperationException и задокументируйте...
Re[2]: Возможно ли это?
От: mrjeka Россия  
Дата: 14.09.09 12:50
Оценка:
Здравствуйте, Пельмешко, Вы писали:

M>>или еще лучше, если при создании объекта этого поля не будет видно вообще.


П>А я приведу к базовому типу и всё равно вызову сеттер

П>Бросайте в нём InvalidOperationException и задокументируйте...

Ну InvalidOperationException или NotSupportedException все равно будут поставлены. Просто можно ли скрыть как-нибудь это поле? пробовал [Browsable(false)], не помогает.
Re: Возможно ли это?
От: Аноним  
Дата: 14.09.09 12:56
Оценка: +1 :)
public class BaseClass
{
public virtual string Prop1 { get; private set; }
}
Re[2]: Возможно ли это?
От: mrjeka Россия  
Дата: 14.09.09 13:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А> public class BaseClass

А> {
А> public virtual string Prop1 { get; private set; }// Ну это же бред!
//а если в одном из наследников сеттер разрешен???
А> }

И вообще с доступом разрулил. (через new )
Re[3]: Возможно ли это?
От: Lexxpin  
Дата: 14.09.09 13:11
Оценка:
Здравствуйте, mrjeka, Вы писали:

M>И вообще с доступом разрулил. (через new )


new убивает виртуальность.
Re[4]: Возможно ли это?
От: mrjeka Россия  
Дата: 14.09.09 15:00
Оценка:
Здравствуйте, Lexxpin, Вы писали:

L>new убивает виртуальность.


А есть другие предложения????
Re[4]: Возможно ли это?
От: hexamino http://hexamino.blogspot.com/
Дата: 14.09.09 15:12
Оценка: 1 (1)
Здравствуйте, Lexxpin, Вы писали:

L>new убивает виртуальность.


На самом деле new только подавляет warning.
Re: Возможно ли это?
От: Ziaw Россия  
Дата: 15.09.09 08:26
Оценка: +2
Здравствуйте, mrjeka, Вы писали:

M>Как можно, и можно ли вообще, запретить изменять значение св-ва Prop1 в дочернем классе?

M>Необходимо это видеть на этапе компиляции, как например [Obsolete].
M>или еще лучше, если при создании объекта этого поля не будет видно вообще.

Вы нарушаете очень важный принцип ООП — LSP.

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

Скорее всего наследование применено здесь не по месту.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.