Kisegítő lehetőségek korlátozása (C# programozási útmutató)
A tulajdonság vagy indexelő lekérési és beállítási részeit tartozéknak nevezzük. Alapértelmezés szerint ezek a tartozékok ugyanolyan láthatósági vagy hozzáférési szinttel rendelkeznek annak a tulajdonságnak vagy indexelőnek, amelyhez tartoznak. További információ: akadálymentességi szintek. Néha azonban hasznos lehet korlátozni az egyik tartozékhoz való hozzáférést. Általában korlátozza a tartozék akadálymentességét set
, miközben a get
tartozék nyilvánosan elérhető marad. Példa:
private string _name = "Hello";
public string Name
{
get
{
return _name;
}
protected set
{
_name = value;
}
}
Ebben a példában egy úgynevezett Name
tulajdonság definiál egy és set
egy kiegészítőtget
. Ebben get
az esetben a tartozék maga public
a tulajdonság akadálymentességi szintjét kapja meg, míg a set
tartozék kifejezetten korlátozott, ha a védett hozzáférési módosító magára a tartozékra van alkalmazva.
Feljegyzés
A cikkben szereplő példák nem használnak automatikusan implementált tulajdonságokat. Az automatikusan implementált tulajdonságok tömör szintaxist biztosítanak a tulajdonságok deklarálásához, ha nincs szükség egyéni háttérmezőre.
A tartozékokkal kapcsolatos hozzáférési módosítók korlátozásai
A tartozékmódosítók tulajdonságokon vagy indexelőkön való használatára a következő feltételek vonatkoznak:
- Nem használhat kiegészítő módosítókat sem interfészen, sem explicit felülettag-implementáción .
- A kiegészítő módosítókat csak akkor használhatja, ha a tulajdonság vagy az indexelő mindkettővel
set
ésget
tartozékokkal is rendelkezik. Ebben az esetben a módosító csak a két tartozék egyikén engedélyezett. - Ha a tulajdonság vagy indexelő rendelkezik felülbírálási módosítóval, a kiegészítő módosítónak meg kell egyeznie a felülbírált tartozék tartozékával, ha van ilyen.
- A tartozék akadálymentességi szintjének szigorúbbnak kell lennie, mint magának a tulajdonságnak vagy indexelőnek az akadálymentességi szintje.
Hozzáférés módosítókhoz a felülíró tartozékokon
Tulajdonság vagy indexelő felülbírálása esetén a felülbírált tartozékoknak elérhetőnek kell lenniük a felülbíráló kódhoz. Emellett a tulajdonság/indexelő és tartozékai akadálymentességének meg kell egyeznie a megfelelő felülbírált tulajdonságnak/indexelőnek és tartozékainak. Példa:
public class Parent
{
public virtual int TestProperty
{
// Notice the accessor accessibility level.
protected set { }
// No access modifier is used here.
get { return 0; }
}
}
public class Kid : Parent
{
public override int TestProperty
{
// Use the same accessibility level as in the overridden accessor.
protected set { }
// Cannot use access modifier here.
get { return 0; }
}
}
Implementálási felületek
Ha egy tartozékot használ egy interfész implementálásához, előfordulhat, hogy a tartozék nem rendelkezik hozzáférési módosítóval. Ha azonban az interfészt egy tartozék használatával valósítja meg, például get
a másik tartozék rendelkezhet hozzáférési módosítóval, ahogyan az alábbi példában is látható:
public interface ISomeInterface
{
int TestProperty
{
// No access modifier allowed here
// because this is an interface.
get;
}
}
public class TestClass : ISomeInterface
{
public int TestProperty
{
// Cannot use access modifier here because
// this is an interface implementation.
get { return 10; }
// Interface property does not have set accessor,
// so access modifier is allowed.
protected set { }
}
}
Tartozék akadálymentességi tartománya
Ha hozzáférési módosítót használ a tartozékon, a tartozék akadálymentességi tartományát ez a módosító határozza meg.
Ha nem használt hozzáférési módosítót a tartozékon, a tartozék akadálymentességi tartományát a tulajdonság vagy az indexelő akadálymentességi szintje határozza meg.
Példa
Az alábbi példa három osztályt tartalmaz, BaseClass
DerivedClass
és MainClass
. A két osztály két tulajdonsággal BaseClass
Name
Id
rendelkezik. A példa bemutatja, hogy a tulajdonság hogyan rejtheti el a tulajdonságot BaseClass
Id
DerivedClass
Id
olyan korlátozó hozzáférés-módosító használatakor, mint a védett vagy a privát. Ezért ha értékeket rendel ehhez a tulajdonsághoz, a rendszer az osztály tulajdonságát BaseClass
hívja meg helyette. A hozzáférés-módosító nyilvánosra cserélése akadálymentessé teszi a tulajdonságot.
A példa azt is szemlélteti, private
protected
hogy a tulajdonság tartozékán set
Name
található korlátozó hozzáférés-módosító megakadályozza a tartozékhoz való hozzáférést a származtatott osztályban DerivedClass
. Hiba keletkezik, amikor hozzá van rendelve, vagy hozzáfér az azonos nevű alaposztálytulajdonsághoz, ha az elérhető.
public class BaseClass
{
private string _name = "Name-BaseClass";
private string _id = "ID-BaseClass";
public string Name
{
get { return _name; }
set { }
}
public string Id
{
get { return _id; }
set { }
}
}
public class DerivedClass : BaseClass
{
private string _name = "Name-DerivedClass";
private string _id = "ID-DerivedClass";
new public string Name
{
get
{
return _name;
}
// Using "protected" would make the set accessor not accessible.
set
{
_name = value;
}
}
// Using private on the following property hides it in the Main Class.
// Any assignment to the property will use Id in BaseClass.
new private string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
}
class MainClass
{
static void Main()
{
BaseClass b1 = new BaseClass();
DerivedClass d1 = new DerivedClass();
b1.Name = "Mary";
d1.Name = "John";
b1.Id = "Mary123";
d1.Id = "John123"; // The BaseClass.Id property is called.
System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
Base: Name-BaseClass, ID-BaseClass
Derived: John, ID-BaseClass
*/
Megjegyzések
Figyelje meg, hogy ha lecseréli a deklarációt new private string Id
new public string Id
, a kimenet a következő lesz:
Name and ID in the base class: Name-BaseClass, ID-BaseClass
Name and ID in the derived class: John, John123