Jak zrobić dodatkowe opcje do właściwości?
Na przykład tworzę właściwość Count i chcę mieć w niej dodatkowe właściwości "Triangle" , "Gifts", "Ornamentation".
Na koniec chcę uzyskać coś takiego:
"jakaś_klasa.Count.Gifts;"
Wątek przeniesiony 2015-01-20 02:05 z C# i .NET przez somekind.
Jak zrobić dodatkowe opcje do właściwości?
Na przykład tworzę właściwość Count i chcę mieć w niej dodatkowe właściwości "Triangle" , "Gifts", "Ornamentation".
Na koniec chcę uzyskać coś takiego:
"jakaś_klasa.Count.Gifts;"
Zrób z Count
klasę.
Lecz to powinno iść w drugą stronę: Gifts.Count
, Triangles.Count
(...).
Wydaje mi się że coś źle kombinujesz. Co ma Count do Triangle , Gifts lub Ornamentation?
Przykład:
Gdzie: "Margin" to właściwość , "Left" to także właściwość.
No to zrób klasę.
Ale mówię, że przekombinowywujesz i robisz to na odwrót.
Ponieważ Margin jest klasą która posiada te właściwości.
Ale chodzi o to że coś źle to projektujesz. Count nie może być klasą która posiada Ornamentation bo to nie ma sensu.
Tak jak napisał @dam1an, Margin
jest typu Padding
, która oferuje swoje właściwości i metody.
Zrobiłem coś takiego:
class Choinka
{
public TrojkatWlasciwosci Drzewo { get; set; }
}
class TrojkatWlasciwosci
{
private int ile_trojkatow = 3;
public Graphics miejsce_rysowania;
private SolidBrush[] kolor = { new SolidBrush(Color.Green), new SolidBrush(Color.GreenYellow), new SolidBrush(Color.DarkSeaGreen), new SolidBrush(Color.LightSeaGreen), new SolidBrush(Color.LawnGreen) };
List<Point> lista_trojkatow = new List<Point>();
public int Liczba
{
get
{
return ile_trojkatow;
}
set
{
ile_trojkatow = value;
}
}
private Graphics Miejsce_Rysowania
{
get
{
return miejsce_rysowania;
}
set
{
miejsce_rysowania = value;
}
}
#region Polozenie
/*
* Przeznaczenie:
* Określa polozenie danego punktu na osi X oraz Y.
*/
public Koordynacja Polozenie { get; set; }
#endregion
public void RysujDrzewo()
{
for (int i = 0; i < ile_trojkatow; i++)
{
if (Polozenie.X_Prawy[i] != null)
{
Point punkt_a = new Point(Polozenie.X_Lewy[i], Polozenie.Y_Lewy[i]);
Point punkt_b = new Point(Polozenie.X_Prawy[i], Polozenie.Y_Prawy[i]);
Point punkt_c = new Point(Polozenie.X_Srodkowy[i], Polozenie.Y_Srodkowy[i]);
Point[] tablica_punktow = { punkt_a, punkt_b, punkt_c };
lista_trojkatow.Add(tablica_punktow[i]);
miejsce_rysowania.FillPolygon(kolor[1], tablica_punktow);
}
}
}
}
public class Koordynacja
{
private int[] x_prawy = new int[100];
private int[] y_prawy = new int[100];
private int[] x_lewy = new int[100];
private int[] y_lewy = new int[100];
private int[] x_srodkowy = new int[100];
private int[] y_srodkowy = new int[100];
public int[] X_Prawy
{
get
{
return x_prawy;
}
set
{
x_prawy = value;
}
}
public int[] Y_Prawy
{
get
{
return y_prawy;
}
set
{
y_prawy = value;
}
}
public int[] X_Lewy
{
get
{
return x_lewy;
}
set
{
x_lewy = value;
}
}
public int[] Y_Lewy
{
get
{
return y_lewy;
}
set
{
y_lewy = value;
}
}
public int[] X_Srodkowy
{
get
{
return x_srodkowy;
}
set
{
x_srodkowy = value;
}
}
public int[] Y_Srodkowy
{
get
{
return y_srodkowy;
}
set
{
y_srodkowy = value;
}
}
public void UtworzPunkty(int ile_trojkatow)
{
try
{
int y_wlasciwe_Srodkowe = 100;
int x_wlasciwe_Lewe = 100;
int x_wlasciwe_Prawe = 250;
int x_wlasciwe_Srodkowe = 125;
int roznica_wysokosci = 50;
int poprawione = 30;
for (int i = 0; i < ile_trojkatow; i++)
{
x_srodkowy[i] = x_wlasciwe_Srodkowe;
y_srodkowy[i] = y_wlasciwe_Srodkowe;
y_wlasciwe_Srodkowe += roznica_wysokosci;
x_lewy[i] = x_wlasciwe_Lewe;
x_prawy[i] = x_wlasciwe_Prawe;
y_wlasciwe_Srodkowe -= poprawione;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.GetBaseException().ToString(), "Błąd!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
i teraz jak w Kodzie formy chcę się odwołać np:
Choinka choinka = new Choinka();
choinka.Drzewo.Polozenie.UtworzPunkty(3);
Dostaję komunikat:
"Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu."
Dlaczego?
Bo w klasie Choinka nigdzie nie tworzysz obiektu, ktory ma byc przypisany do wlasciwosci TrojkatWlasciwosci.
Mogę prosić o jakiś prosty przykład?
Stwórz instancję klasy TrojkatWlasciwosci
w konstruktorze klasy Choinka
i przypisz do odpowiedniego pola.
class Choinka
{
public TrojkatWlasciwosci Drzewo { get; set; }
public Choinka()
{
Drzewo = new TrojkatWlasciwosci();
}
}
Problem rozwiązany :)