Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
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
Denis Homolík (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
Vše je možné, dokud si to myslíte!
Avatar
Jan Vargovský
Redaktor
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
Daniel Kosík (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ý
Redaktor
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ý
Redaktor
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.