IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Zamezit změnit property jinde než ve vlastnící třídě

Aktivity
Avatar
Lako
Člen
Avatar
Lako:12.3.2014 22:23

Možná jsem uplně mimo a řeším věc, která se řeší uplně jinak, nebo na to nemůžu přijít...
Ale potřeboval bych: abych jistou vlastnost (zde Obvod) mohl nastavit pouze ve vlastnící třídě (Kolo).

tedy takle:

public class Kolo
{
public double Obvod { get; set; }

public void pocitejObvod(double polomer)
{
this.Obvod = polomer*2* Math.Pi;
}

}

Tedy abych k Obvodu moh přistoupit, ale nemohl ho změnit (pouze pomocí počítací metody)...
Díky

Editováno 12.3.2014 22:24
 
Odpovědět
12.3.2014 22:23
Avatar
alfonz
Člen
Avatar
alfonz:12.3.2014 22:28

Nastav:

public double Obvod {private set; public get;}
Editováno 12.3.2014 22:30
Nahoru Odpovědět
12.3.2014 22:28
lmao
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Lako
Jan Vargovský:12.3.2014 22:29
public class Kolo
{
public double Obvod { get; private set; }

public void pocitejObvod(double polomer)
{
this.Obvod = polomer*2* Math.Pi;
}

}

nebo

public class Kolo
{
private double obvod;


public double Obvod
{
  get{ return obvod;}
}

public void pocitejObvod(double polomer)
{
obvod = polomer*2* Math.Pi;
}

}
 
Nahoru Odpovědět
12.3.2014 22:29
Avatar
Ghost4Man
Člen
Avatar
Ghost4Man:12.3.2014 22:31

Modifikátor private u setteru vlastnosti:

public double Obvod { get; private set; }
Nahoru Odpovědět
12.3.2014 22:31
Všechno na světě můžete chtít. Jenom nemůžete chtít, aby se vám chtělo.
Avatar
Lako
Člen
Avatar
Odpovídá na Jan Vargovský
Lako:13.3.2014 0:23

Mnho, tak díky... Jsem to zkoušel s tou private, ale problém je že Obvod je implementací rozhraní - takže to brblalo..
V definici rozhraní se musí odstranit set;
Což je mi zase záhadou, že to pak jde setnout..
pro úplnost finální funkční kód:

public class Kolo:ITvary
{
public double Obvod { get; private set; }

public void pocitejObvod(double polomer)
{
this.Obvod = polomer*2* Math.Pi;
}

}


interface ITvary
{
pocitejObvod(double polomer);
double Obvod(get;);

}
 
Nahoru Odpovědět
13.3.2014 0:23
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Lako
Jan Vargovský:13.3.2014 1:12

Tohle určitě funkční není :) každopádně aplikace poněkud divná, protože první vypočítáš a pak až si někde jinde musíš tu hodnotu vyzvednout. Kdyby to bylo v konstruktoru tak jo, nebo kdyby to přímo vracelo hodnotu tak taky, ale tohle mi přijde trošku divné.

Dále interface by se měl pojmenovávat v jednotném čísle (to platí i o třídě) takže by to měl být ITvar. I když já bych si o rozhraní ITvar představoval něco jiného.

Podle další konvence z C# by se metoda měla pojmenovávat pomocí CamelCase, takže tvoje metoda by měla být PocitejObvod(double polomer).

K těm chybám: metoda v rozhraní nemá návratový typ; takhle se vlastnost nedeklaruje.

interface ITvar
{
    void pocitejObvod(double polomer);
    double Obvod { get; }

}

a třída třeba takto:

public class Kolo : ITvar
{
    private double obvod;
    public double Obvod
    {
        get { return obvod; }
    }

    public void pocitejObvod(double polomer)
    {
        obvod = polomer * 2 * Math.PI;
    }
}
 
Nahoru Odpovědět
13.3.2014 1:12
Avatar
Lako
Člen
Avatar
Odpovídá na Jan Vargovský
Lako:13.3.2014 9:36

Jo, já vím spoustu chyb- psal jsem to narychlo,jako demonstrační kód.
Ve skutečnosti to počítám u věcí, u kterých to smysl dává...
Nevím, jestli jsi tu nefunkčnost myslel k tomu mému paskvilkódu, nebo k tomu jak se to vyřešilo s tou private set...
V tom druhým případě mi to dokonce Resharper, když sem se to snažil udělat tak jak ukazuješ (property with back field)
( a skutečně to běží)
Rozhodopádně díky za pomoc

 
Nahoru Odpovědět
13.3.2014 9:36
Avatar
Lako
Člen
Avatar
Odpovídá na Jan Vargovský
Lako:13.3.2014 9:36

Jo, já vím spoustu chyb- psal jsem to narychlo,jako demonstrační kód.
Ve skutečnosti to počítám u věcí, u kterých to smysl dává...
Nevím, jestli jsi tu nefunkčnost myslel k tomu mému paskvilkódu, nebo k tomu jak se to vyřešilo s tou private set...
V tom druhým případě mi to dokonce Resharper, když sem se to snažil udělat tak jak ukazuješ (property with back field)
( a skutečně to běží)
Rozhodopádně díky za pomoc

 
Nahoru Odpovědět
13.3.2014 9:36
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Lako
Jan Vargovský:13.3.2014 9:45

Od toho tu jsme.

 
Nahoru Odpovědět
13.3.2014 9:45
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.