Sobes.tech
Middle

Ի՞նչ է C#-ում մեթոդների վերագրումը և թաքցնումը:

sobes.tech AI

Պատասխան AI-ից

Արժեքային վերաշարադրումը (override) օգտագործվում է պոլիմորֆիզմը իրականացնելիս՝ թույլ տալով ժառանգական դասին տրամադրել իր սեփական իրականացումը վիրտուալ, աբստրակտ կամ ժառանգված մեթոդի։ virtual բանալի բառը բազային դասում և override՝ ժառանգականում պարտադիր են։

Թաքցնումը (hiding, shadowing) նույն անունով մեթոդով ժառանգական դասում՝ բազային դասի մեթոդից։ Բազային դասի մեթոդը մնում է հասանելի, բայց դեպի այն հասանելի է ժառանգական օբյեկտից՝ բացահայտ վերածնման կամ base բանալի բառով։ Օգտագործվում է new բանալի բառը ժառանգականում։

Գծանշում Արժեքային վերաշարադրում (Override) Թաքցնում (Hiding)
Բանալի բառ virtual (բազային), override (ժառանգական) new (ժառանգական)
Պոլիմորֆիզմ Այո, կանչվում է ժառանգական օբյեկտի իրականացումը Ոչ, կանչվում է տիպի վրա հիմնված իրականացումը
Կոչ բազային տիպի հղումով Կոչվում է ժառանգական օբյեկտի վերաշարադրված մեթոդը Կոչվում է բազային դասի մեթոդը
Բազային մեթոդին հասանելիություն base.MethodName()-ով base.MethodName()-ով կամ վերածնման միջոցով
public class BaseClass
{
    public virtual void ShowMessage() // Վիրտուալ մեթոդ վերաշարադրելու համար
    {
        Console.WriteLine("Message from BaseClass (virtual).");
    }

    public void DisplayInfo() // Թաքցնելու մեթոդ
    {
        Console.WriteLine("Info from BaseClass.");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage() // Վիրտուալ մեթոդի վերաշարադրում
    {
        Console.WriteLine("Message from DerivedClass (override).");
    }

    public new void DisplayInfo() // Թաքցնում մեթոդը
    {
        Console.WriteLine("Info from DerivedClass (new).");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        BaseClass baseObj = new BaseClass();
        DerivedClass derivedObj = new DerivedClass();
        BaseClass derivedAsBase = new DerivedClass(); // Բազային տիպի հղում ժառանգական օբյեկտին

        baseObj.ShowMessage();     // Արտածում՝ Message from BaseClass (virtual)
        baseObj.DisplayInfo();     // Արտածում՝ Info from BaseClass

        derivedObj.ShowMessage();  // Արտածում՝ Message from DerivedClass (override)
        derivedObj.DisplayInfo();  // Արտածում՝ Info from DerivedClass (new)

        derivedAsBase.ShowMessage(); // Արտածում՝ Message from DerivedClass (override)։ (Պոլիմորֆիզմի գործածություն)
        derivedAsBase.DisplayInfo(); // Արտածում՝ Info from BaseClass։ (BaseClass-ի մեթոդը կանչվում է հղումի տիպի պատճառով)
    }
}