non-static: klasa.podklasa.jakiś_get

0

Mam takie statyczne coś:

public class Paths
{
	public class AutoSaves
	{
		public static string Forever
		{
			get { return Paths.Documents + @"\TrackMania\Tracks\Replays\Autosaves"; }
		}

		public static string TM2
		{
			get { return Paths.Documents + @"\ManiaPlanet\Replays\Autosaves"; }
		}
	}
}

I jest do dobre. Mam też takie nie-statyczne coś:

public class Track
{
	XmlDocument xmlHead;

	// ...

	public int Bronze
	{
		get { return Convert.ToInt32(xmlHead.SelectSingleNode("/header/times/@bronze").Value); }
	}
	public int Silver
	{
		get { return Convert.ToInt32(xmlHead.SelectSingleNode("/header/times/@silver").Value); }
	}
	public int Gold
	{
		get { return Convert.ToInt32(xmlHead.SelectSingleNode("/header/times/@gold").Value); }
	}
	public int AuthorTime
	{
		get { return Convert.ToInt32(xmlHead.SelectSingleNode("/header/times/@authortime").Value); }
	}
	public int AuthorScore
	{
		get { return Convert.ToInt32(xmlHead.SelectSingleNode("/header/times/@authorscore").Value); }
	}
}

I nie jest to złe ale chciałbym "zawinąć to" w podklasę "Times", analogicznie jak w przykładzie statycznym. Szukałem w internecie i chyba (niestety) tak prosto się nie da, racja? A jeśli tak to jak najmniej ingerując w metody korzystające z tego (bibliotecznego) kodu to zrobić?

0

Da się, jeżeli xmlHead będzie polem statycznym. Mam wrażenie, że próbujesz zrobić coś, czego normalnie się nie robi. Jak podasz przykład do czego chcesz to wykorzystać, to może uda się podpowiedzieć ci jak powinno być to dobrze zrobione.

0
Sarrus napisał(a):

Da się, jeżeli xmlHead będzie polem statycznym.
Track być może mógłby ale replay już nie a chciałbym tu też "zawijać" gety. Przykład użycia replay-a:

Tm.Replay srcReplay = new Tm.Replay();
srcReplay.Load(srcGbx, false);
Tm.Replay dstReplay = new Tm.Replay();
dstReplay.Load(dstGbx, false); 

Dalej jest ponad 30 linii czegoś takiego:

if (srcReplay.Best < dstReplay.Best)
	isSrcBetter = true;

To fragment kodu archiwizująceo replay-e TrackManii, który sprawdza czy ten już będący w archiwum nie jest aby lepszy od nowego.

Sarrus napisał(a):

Mam wrażenie, że próbujesz zrobić coś, czego normalnie się nie robi.
"Zawijanie" Get-ów, jeśli klasa ma służyć m.in. do udostępniania informacji, powinno być normalne.

Mam klasy analizujące trasę lub replay i służace informacją na ich temat. Mam zamiar dodać tam trochę rzeczy i chciałbym wcześniej "pozawijać" sobie get-y by kod był bardziej czytelny a w podpowiedziach były rzeczy logicznie pogrupowane. Track już ma ich 21 a będzie więcej.

0

Mógłbyś podać przykład jak takie "zawinięte" gety wyglądają? Nie rozumiem o co z tym chodzi, co chcesz osiągnąć.

0

Chyba powinienem napisać pogrupowane, ze strony metody kożystającej powinno to wyglądać:

track.Times
.inna podklasa/metoda
.jakaś podklasa/metoda

A w Times Gety:

track.Times.Bronze
.Gold
.Silver

0

Stwórz klasę Times, która będzie publiczną właściwością w Track i w konstruktorze będzie przyjmowała XmlDocument.

0

Próbowałem napisać coś takiego jak podałeś:

namespace Tm
{
	public class Test
	{
		string infoStr;

		public Test()
		{
			infoStr = "to jest test";
		}

		public Info info = new Info(**infoStr**);

		public class Info
		{
			public string infoString;

			public Info(string info)
			{
				infoString = info;
			}
			
			public string Str
			{
				get { return infoString; }
			}
		}
	}
}

Ale nie działa bo pogrubione (z gwiazdkami) (bold w kodzie nie działa?):
A field initializer cannot reference the non-static field, method, or property 'Tm.Test.infoStr'

Nie wiem też jek zrobić "klasę która będzie publiczną właściwością".

0

Sam już trochę sobie pomogłem:

string infoStr;
public Info info;

public Test()
{
	infoStr = "to jest test";
	info = new Info(infoStr);
}
0

Dzięki Rev, to rozwiązuje mój problem (i to jak prosto). Zabiorę się teraz do studiowania podstaw .Net i C#, zamiast pisać takie progsy bez (jak okazuje się) należytej znajomości podstaw:
user image
Duży obrazek: http://i.imgur.com/fRP1nWc.jpg

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