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

C# .NET .NET (C# a Visual Basic) Zamezit změnit property jinde než ve vlastnící třídě American English version English version

Avatar
Lako
Člen
Avatar
Lako:

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
Denis Homolík (Alfonz):

Nastav:

public double Obvod {private set; public get;}
Editováno 12.3.2014 22:30
Nahoru Odpovědět 12.3.2014 22:28
Vše je možné, dokud si to myslíte!
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Lako
Jan Vargovský:
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
Daniel Kosík (Ghost4Man):

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:

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ý
Redaktor
Avatar
Odpovídá na Lako
Jan Vargovský:

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:

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:

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ý
Redaktor
Avatar
 
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.