Sobes.tech
Middle

C# da metodlarni qayta yozish va yashirish o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

Overriding (override) polimorfizmni amalga oshirish uchun ishlatiladi, bu orqali voris sinf virtual, abstrakt yoki meros olingan metodning o'z versiyasini taqdim etadi. virtual kalit so'zi asosiy sinfda va override kalit so'zi voris sinfda majburiy.

Hiding (hiding, shadowing) esa voris sinfda bir xil nomdagi metod bilan amalga oshiriladi, u asosiy sinfdan metodni yashiradi. Asosiy sinfdagi metod saqlanadi, ammo unga voris sinf ob'ektidan kirish aniq turga yoki base kalit so'zi orqali amalga oshiriladi. Voris sinfda new kalit so'zi ishlatiladi.

Xususiyat Override (Qayta yozish) Hiding (Yashirish)
Kalit so'z virtual (asosiy), override (voris) new (voris)
Polimorfizm Ha, voris sinfning amalga oshirilishi chaqiriladi Yo'q, bog'langan turga qarab chaqiriladi
Asosiy turdagi referens bilan chaqirish Qayta yozilgan voris metod chaqiriladi Asosiy sinf metod chaqiriladi
Asosiy sinf metodiga kirish base.MethodName() orqali base.MethodName() yoki turga o'tkazish orqali
public class BaseClass
{
    public virtual void ShowMessage() // Virtual metodni qayta yozish uchun
    {
        Console.WriteLine("BaseClass'dan xabar (virtual).");
    }

    public void DisplayInfo() // Yashirish uchun metod
    {
        Console.WriteLine("BaseClass'dan ma'lumot.");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage() // Virtual metodni qayta yozish
    {
        Console.WriteLine("DerivedClass'dan xabar (override).");
    }

    public new void DisplayInfo() // Metodni yashirish
    {
        Console.WriteLine("DerivedClass'dan ma'lumot (new).");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        BaseClass baseObj = new BaseClass();
        DerivedClass derivedObj = new DerivedClass();
        BaseClass derivedAsBase = new DerivedClass(); // Asosiy turdagi referens voris ob'ektiga

        baseObj.ShowMessage();     // Chiqish: BaseClass'dan xabar (virtual).
        baseObj.DisplayInfo();     // Chiqish: BaseClass'dan ma'lumot.

        derivedObj.ShowMessage();  // Chiqish: DerivedClass'dan xabar (override).
        derivedObj.DisplayInfo();  // Chiqish: DerivedClass'dan ma'lumot (new).

        derivedAsBase.ShowMessage(); // Chiqish: DerivedClass'dan xabar (override). (Polimorfizm faoliyatda)
        derivedAsBase.DisplayInfo(); // Chiqish: BaseClass'dan ma'lumot. (Referens turiga asoslangan metod chaqiriladi)
    }
}