wlasciwosc tylko get dostep z konstruktora

0

Hej,
koduję sobie proste rzeczy dla nauki.
Zrobiłem klasę abstrakcyjną Człowiek i ustawiłem datę urodzenia jako prywatną i z właściwością tylko get (daty urodzenia nie zmienimy).
Następnie w klasie dziedziczącej Mężczyzna mam konstruktor, w którym chcę ustawić datę urodzenia. VS mówi mi, że nie mogę.
Jak w takim razie zrobić tak by można było prywatne pole dataUr ustawić tylko raz (za pomoca konstruktora) i później żeby było tylko read-only?
Pomyślałem o prywatnej metodzie SetUr(value), ale w sumie chciałem wykorzystać własciowosći. Czy jest jakiś sposób? Z góry dzięki :)

 
namespace AplikacjaDoTestowania
{
    abstract class Czlowiek
    {
        public string imie{get; set;}
        public string nazwisko{get; set;}
        private string dataUr { get; }
        public TimeSpan ileDniZyje()
        {
            DateTime t = DateTime.Now;
            DateTime dt = Convert.ToDateTime(dataUr);
            TimeSpan res = t - dt;
            return res;
        }

        public void jedz(string potrawa)
        {
            Console.WriteLine("OM NOM NOM! " + potrawa + "! Moge jeść w nieskończoność!");
        }

    }


}
 
namespace AplikacjaDoTestowania
{
    class Mezczyzna : Czlowiek
    {
        public Czlowiek(string imie, string nazwisko, string dataUr)
        {
            this.imie = imie;
            this.nazwisko = nazwisko;
            this.dataUr = dataUr;
        }
    }
}
3

Chyba chcesz zrobić coś takiego:

public string dataUr { get; protected set; }

Lub coś takiego:

public abstract class Człowiek
{
   private readonly DateTime _dataUrodzenia;
   // EDIT: Lub
   // protected readonly DateTime _dataUrodzenia;

   public Człowiek(DateTime dataUrodzenia)
   {
      _dataUrodzenia = dataUrodzenia;
   }

   public DateTime DataUrodzenia
   {
      get { return _dataUrodzenia; }
   }
}

public class Mężczyzna : Człowiek
{
   public Mężczyzna(DateTime dataUrodzenia)
      : base(dataUrodzenia)
   {}
}
0

Ja tam bym zrobił protected readonly raczej.

0

Jeżeli chcesz zrobić właściwość tylko do odczytu to musisz zdeklarować jego gettera. Nie może być on domyślny.

private string dataUrodzenia
private string dataUr
 { get {return dataUrodzenia;} } 


Wtedy kompilator zaakceptuje ci to.

Jeżeli chcesz by z innej klasy (oprócz tej) nie dało się zmienić wartości właściwości wystarczy dać prywatnego settera

A jeżeli chcesz by właściwość była tylko do odczytu, musisz zdeklarować jej gettera. No ale będzie wtedy można operować na polu. No to pole też robisz tylko do odczytu i nadajesz wartość temu polu w konstruktorze. Wartość property tylko do odczytu nie da się zmienić nigdy (nawet w konstruktorze), a readonly field w konstruktorze nadać się da.

0

Dzięki wielkie,
@DibbyDum czy są jakieś praktyczne różnice w tych dwóch sposobach? Któryś jest "właściwszy"? Czy może nie ma żadnej różnicy?

1

Według twojego opisu lepszym rozwiązaniem będzie użycie protected readonly DateTime _dataUrodzenia; skoro nie chcesz dać możliwości modyfikowania daty jak już raz zostanie nadana ale chcesz operować na niej w klasach dziedziczących. Również proponuje na takich prostych przykładach poeksperymentować z modyfikatorami dostępu i z dziedziczeniem.
https://msdn.microsoft.com/pl-pl/library/wxh6fsc7.aspx
https://msdn.microsoft.com/pl-pl/library/ms173149.aspx
https://msdn.microsoft.com/pl-pl/library/ms173152.aspx

0

ok bardzo dziekuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1