কিভাবে বেস.বেস.মোথোড () কল করবেন?


126
// Cannot change source code
class Base
{
    public virtual void Say()
    {
        Console.WriteLine("Called from Base.");
    }
}

// Cannot change source code
class Derived : Base
{
    public override void Say()
    {
        Console.WriteLine("Called from Derived.");
        base.Say();
    }
}

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        base.Say();
    }
}

class Program
{
    static void Main(string[] args)
    {
        SpecialDerived sd = new SpecialDerived();
        sd.Say();
    }
}

ফলাফল হলো:

স্পেশাল ডারাইভ থেকে ফোন করা।
ডেরাইভ থেকে ফোন করা। / * এটি প্রত্যাশিত নয় * /
বেস থেকে কল করা।

মধ্যবিত্ত "ডেরিভড" এর পদ্ধতিটি না ডেকে আমি কীভাবে স্পেশাল ডারাইভড ক্লাসটি আবার লিখতে পারি?

আপডেট: আমি বেসের পরিবর্তে ডেরিভড থেকে উত্তরাধিকারী হওয়ার কারণটি ডারাইভ ক্লাসে রয়েছে আরও অনেকগুলি বাস্তবায়ন রয়েছে। যেহেতু আমি base.base.method()এখানে করতে পারি না , তাই অনুমান করি সবচেয়ে ভাল উপায়টি নিম্নলিখিতটি করা কি?

// সোর্স কোড পরিবর্তন করা যায় না

class Derived : Base
{
    public override void Say()
    {
        CustomSay();

        base.Say();
    }

    protected virtual void CustomSay()
    {
        Console.WriteLine("Called from Derived.");
    }
}

class SpecialDerived : Derived
{
    /*
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        base.Say();
    }
    */

    protected override void CustomSay()
    {
        Console.WriteLine("Called from Special Derived.");
    }
}

আপনার আপডেটের সাথে মেলে সম্পাদনা।
জোশ জোর্দান

উত্তর:


106

কেবল এখানে এটি যুক্ত করতে চান, যেহেতু বহু সময় পরেও লোকেরা এই প্রশ্নে ফিরে আসে। অবশ্যই এটি খারাপ অনুশীলন, তবে লেখক যা চান তার সাথে এটি করা (নীতিগতভাবে) এখনও সম্ভব:

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer();            
        var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr);
        baseSay();            
    }
}

46
আমি এই উত্তরটি সত্যই পছন্দ করি কারণ প্রশ্নটি এটির প্রস্তাবিত কিনা বা এটি একটি ভাল ধারণা কিনা তা নয়, প্রশ্নটি ছিল এটি করার একটি উপায় আছে কিনা এবং তাই যদি সেই উপায়টি হয় তবে।
শাওয়াইস

3
বিশেষত কার্যকর যখন আপনি ফ্রেমওয়ার্ক / libs এক্সটেনসিবিলিটি অভাব মোকাবেলা করতে হবে। উদাহরণস্বরূপ, NHibernate যা অত্যন্ত এক্সটেনসিবল এর জন্য আমার এই জাতীয় সমাধানগুলি গ্রহণ করার প্রয়োজন ছিল না। তবে Asp.Net পরিচয়, সত্তা ফ্রেমওয়ার্ক, Asp.Net Mvc সঙ্গে কাজ করার জন্য, আমি নিয়মিতভাবে এই ধরনের হ্যাকগুলি তাদের নিখোঁজ বৈশিষ্ট্যগুলি বা আমার প্রয়োজনীয়তার জন্য অনুপযুক্ত হার্ড কোডিং আচরণগুলি পরিচালনা করার জন্য শেষ করি।
ফ্রেডেরিক

2
তার জন্য ধন্যবাদ! আমি অন্য লোকের কাছে একটি প্রশ্নের জবাবে নির্দেশিকা উদ্ধৃত করা বন্ধ করার জন্য উল্লেখ করতে চাই। এটি কোনও তিরস্কার হিসাবে নয়, কারণ জিজ্ঞাসা করা হয়েছিল। যদি আপনি না জানেন, তবে উত্তর দিন না! আমি সবাইকে কোড-পুলিশকে ব্লাস্ট করার জন্য উত্সাহিত করতে চাই যাতে এটি উত্তর-পোস্ট পোস্ট করা থেকে তাদের নিরুৎসাহিত করবে। যদি কোনও প্রশ্নের উত্তর দেওয়ার পরে, আপনি গাইডলাইনগুলি উদ্ধৃত করতে বাধ্য হন, তবে এগিয়ে যান এবং এটি উল্লেখ করুন।
ড্যানডব্লিউ

1
অন্তর্নিহিত ফাংশন থেকে যদি আমাদের রিটার্ন মান প্রয়োজন হয়?
পারকিনস

2
কিছু মনে নেই, এটি আউট। এর Func<stuff>পরিবর্তে কাস্ট করুনAction
পার্কিনস

92

এটি একটি খারাপ প্রোগ্রামিং অনুশীলন, এবং সি # তে অনুমোদিত নয়। এটি একটি খারাপ প্রোগ্রামিং অনুশীলন কারণ

  • গ্র্যান্ডবেসের বিবরণ হ'ল বেসটির বাস্তবায়ন বিশদ; আপনি তাদের উপর নির্ভর করা উচিত নয়। বেস ক্লাস গ্র্যান্ডবেসের উপরে একটি বিমূর্ততা সরবরাহ করে; আপনার এ অ্যাস্ট্রাকশনটি ব্যবহার করা উচিত, এড়াতে বাইপাস তৈরি করা উচিত নয়।

  • পূর্ববর্তী পয়েন্টটির একটি নির্দিষ্ট উদাহরণ বর্ণনা করার জন্য: যদি অনুমতি দেওয়া হয় তবে এই প্যাটার্নটি কোডটি ভঙ্গুর-বেস-শ্রেণীর ব্যর্থতার জন্য সংবেদনশীল করার আরও একটি উপায় হতে পারে। ধরা যাক Cযেখান থেকে Bউদ্ভূত হয়েছে A। মধ্যে Code Cব্যবহারসমূহ base.baseএকটি পদ্ধতি ডাকতে A। তারপরে লেখক Bবুঝতে পেরেছেন যে তারা ক্লাসে অনেক বেশি গিয়ার রেখেছিল B, এবং এর থেকে আরও ভাল পদ্ধতির মধ্যবর্তী শ্রেণি তৈরি করা হয় B2যা থেকে প্রাপ্ত Aএবং Bপ্রাপ্ত হয় B2। এই পরিবর্তনের পরে কোড ইন Cএকটি পদ্ধতি কল করছে B2, না A, কারণ Cএর লেখক একটি অনুমান করেছিলেন যে বাস্তবায়নের বিশদটি Bযেমন তার সরাসরি বেস শ্রেণিটি হয়A, কখনও পরিবর্তন হবে না। সি # তে অনেকগুলি ডিজাইনের সিদ্ধান্তগুলি বিভিন্ন ধরণের ভঙ্গুর বেস ব্যর্থতার সম্ভাবনা হ্রাস করতে হয়; base.baseঅবৈধ করার সিদ্ধান্ত পুরোপুরি সেই ব্যর্থতার ধরণটির এই বিশেষ গন্ধকে বাধা দেয়।

  • আপনি আপনার বেস থেকে উদ্ভূত কারণ এটি যা করে তা আপনি পছন্দ করেন এবং এটি পুনরায় ব্যবহার এবং প্রসারিত করতে চান। আপনি যদি এটি যা করেন তা পছন্দ না করে এবং এটির সাথে কাজ করার চেয়ে এটির চারপাশে কাজ করতে চান তবে আপনি কেন এটি থেকে প্রথম স্থানটি পেয়েছেন? আপনি যদি সেই কার্যকারিতাটি ব্যবহার করতে এবং প্রসারিত করতে চান তবে গ্র্যান্ডব্যাস থেকে নিজেকে আবিষ্কার করুন।

  • বেসটি গ্র্যান্ডবাসের পদ্ধতিগুলি কীভাবে ব্যবহার করে তার বিশদ দ্বারা রক্ষা করা হয় সুরক্ষা বা শব্দার্থক সামঞ্জস্যের উদ্দেশ্যে কিছু নির্দিষ্ট আক্রমণকারী প্রয়োজন হতে পারে। এই আক্রমণকারীদের বজায় রাখে এমন কোডটি এড়িয়ে যাওয়ার জন্য বেসের একটি উত্পন্ন শ্রেণীকে অনুমতি দেওয়া বেসটি একটি অসামঞ্জস্যিত, দুর্নীতিগ্রস্থ অবস্থায় ফেলতে পারে।


4
@ যাদুন: তারপরে উত্তরাধিকারের তুলনায় রচনাটিকে পছন্দ করুন। আপনার ক্লাসটি বেস বা গ্র্যান্ডবেস উভয়ের একটি উদাহরণ নিতে পারে এবং ক্লাসটি তখন কার্যকারিতা স্থগিত করতে পারে।
এরিক লিপার্ট

4
@ ব্ল্যাকওভারলর্ড: যেহেতু আপনি এই বিষয়ে দৃ strongly়তা বোধ করছেন, তাই কেন এই সাত বছরের পুরানো প্রশ্নটিতে আপনার নিজের একটি উত্তর লিখবেন না? এইভাবে আমরা সকলেই এই বিষয়ে আপনার জ্ঞান থেকে উপকৃত হব এবং এরপরে আপনি স্ট্যাক ওভারফ্লোতে আপনার মোট অবদান দ্বিগুণ করে দুটি উত্তর লিখেছিলেন । এটি একটি জয়-জয়।
এরিক লিপার্ট

4
@ এরিক লিপার্ট: আমি নিজের উত্তরটি না লেখার দুটি কারণ রয়েছে: প্রথমত, আমি কীভাবে এটি করব তা জানতাম না, কেন আমি এই বিষয়টি খুঁজে পেলাম। দ্বিতীয়ত, এই পৃষ্ঠাটির নীচে এভকের একটি বিস্তৃত উত্তর রয়েছে।
ব্ল্যাকওভারলর্ড

3
@ ড্যানডাব্লু: আমি উত্তরটি জানি না; এটি আমার উত্তরের প্রথম বাক্য: সি # তে পছন্দসই বৈশিষ্ট্যটি অনুমোদিত নয় কারণ এটি একটি খারাপ প্রোগ্রামিং অনুশীলন । আপনি সি # তে এটি কীভাবে করেন? আপনি না। এই প্রশ্নের উত্তর আমি জানি না এমন ধারণাটি একটি মজাদার বিষয়, তবে আমরা আরও মন্তব্য না করেই এই পাসটি করব। এখন, আপনি যদি এই উত্তরটি সন্তুষ্ট না পেয়ে থাকেন তবে নিজের উত্তরটি কেন লিখবেন না যা আপনি ভাবেন যে আরও ভাল কাজ করে? এইভাবে আমরা সকলেই আপনার জ্ঞান এবং অভিজ্ঞতা থেকে শিখব এবং আপনি এই বছর পোস্ট করেছেন এমন উত্তরগুলির দ্বিগুণও করবেন।
এরিক লিপার্ট

11
@ এরিকলিপার্ট যদি বেস কোডটি ত্রুটিযুক্ত হয় এবং তৃতীয় পক্ষের নিয়ন্ত্রণের মতো ওভাররাইড করা দরকার হয় তবে কী হবে? এবং বাস্তবায়নের জন্য গ্র্যান্ডবেসে কল রয়েছে? বাস্তব বিশ্বের অ্যাপ্লিকেশনগুলির জন্য, এটি সমালোচনামূলক প্রকৃতির হতে পারে এবং হটফিক্সিংয়ের প্রয়োজন হয় তাই তৃতীয় পক্ষের বিক্রেতার জন্য অপেক্ষা করা কোনও বিকল্প নাও হতে পারে। খারাপ অনুশীলন বনাম উত্পাদন পরিবেশের বাস্তবতা।
শিব

22

আপনি সি # থেকে পারবেন না। আইএল থেকে, এটি আসলে সমর্থিত। আপনি আপনার পিতামাতার যে কোনও ক্লাসে অ-গুণমান কল করতে পারেন ... তবে দয়া করে তা করবেন না। :)


11

উত্তর (যা আমি জানি আপনি যা খুঁজছেন তা নয়):

class SpecialDerived : Base
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        base.Say();
    }
}

সত্যটি হ'ল, আপনি যে শ্রেণীর উত্তরাধিকারী হয়েছিলেন তার সাথে কেবল আপনার সরাসরি মিথস্ক্রিয়া রয়েছে। সেই স্তরটিকে একটি স্তর হিসাবে ভাবুন - এর উত্পন্ন ক্লাসগুলিতে যতটা ইচ্ছা বা তার পিতামাতার কার্যকারিতা ততটুকু সরবরাহ করা হয়।

সম্পাদনা করুন:

আপনার সম্পাদনাটি কাজ করে তবে আমি মনে করি আমি এই জাতীয় কিছু ব্যবহার করব:

class Derived : Base
{
    protected bool _useBaseSay = false;

    public override void Say()
    {
        if(this._useBaseSay)
            base.Say();
        else
            Console.WriteLine("Called from Derived");
    }
}

অবশ্যই, বাস্তব বাস্তবায়নে, আপনি এক্সটেনসিবিলিটি এবং রক্ষণাবেক্ষণের জন্য আরও কিছু এরকম করতে পারেন:

class Derived : Base
{
    protected enum Mode
    {
        Standard,
        BaseFunctionality,
        Verbose
        //etc
    }

    protected Mode Mode
    {
        get; set;
    }

    public override void Say()
    {
        if(this.Mode == Mode.BaseFunctionality)
            base.Say();
        else
            Console.WriteLine("Called from Derived");
    }
}

তারপরে, উত্পন্ন ক্লাসগুলি তাদের পিতামাতার অবস্থা যথাযথভাবে নিয়ন্ত্রণ করতে পারে।


3
Derivedযে কলগুলিতে কেবল কোনও সুরক্ষিত ফাংশনটি কেন লিখবেন না Base.Say, যাতে এটি কল করা যায় SpecialDerived? সরল, না?
নওফাল

7

কেন কেবল শিশু শ্রেণিকে একটি নির্দিষ্ট পিতাম শ্রেণীর মধ্যে ফেলে দেওয়া হয় না এবং তখন নির্দিষ্ট প্রয়োগের জন্য অনুরোধ করা হয় না? এটি একটি বিশেষ কেস পরিস্থিতি এবং একটি বিশেষ কেস সমাধান ব্যবহার করা উচিত। আপনাকে newযদিও বাচ্চাদের পদ্ধতিতে কীওয়ার্ডটি ব্যবহার করতে হবে ।

public class SuperBase
{
    public string Speak() { return "Blah in SuperBase"; }
}

public class Base : SuperBase
{
    public new string Speak() { return "Blah in Base"; }
}

public class Child : Base
{
    public new string Speak() { return "Blah in Child"; }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Child childObj = new Child();

        Console.WriteLine(childObj.Speak());

        // casting the child to parent first and then calling Speak()
        Console.WriteLine((childObj as Base).Speak()); 

        Console.WriteLine((childObj as SuperBase).Speak());
    }
}

2
আপনার যদি এমন কোনও ইঞ্জিন থাকে যা বেস বা শিশু সম্পর্কে জানতে পারে না, এবং সেই ইঞ্জিনটি ডেকে কথা বলার জন্য সঠিকভাবে কাজ করার দরকার পড়ে, কথা বলার জন্য একটি ওভাররাইড হওয়া দরকার, নতুন নয়। যদি সন্তানের বেসের কার্যকারিতাটির 99% প্রয়োজন হয় তবে এক স্পোকের ক্ষেত্রে এটি সুপারবাসের কার্যকারিতা প্রয়োজন ... এটি ওপরের সাথে কথা বলার মতো পরিস্থিতি আমি বুঝতে পারি যে ক্ষেত্রে এই পদ্ধতিটি কাজ করবে না। এটি অস্বাভাবিক নয় এবং সুরক্ষার উদ্বেগ যা সি # এর আচরণকে বাড়িয়ে তুলেছে তা সাধারণত খুব একটা বিষয় নয়।
শাওয়াইস

নিয়ন্ত্রণ এবং ইভেন্ট কল চেইনের ক্ষেত্রে কেবল একটি নোট, পদ্ধতিগুলি প্রায়শই সুরক্ষিত থাকে এবং তাই এটি এর মতো অ্যাক্সেসযোগ্য নয়।
শিব

2
এটি উত্তরাধিকার ব্যবহার করছে না, আপনি প্রতিটি স্পিকারকে একটি সম্পূর্ণ অনন্য নাম দিতে পারেন।
নিক সোটিরিস

হ্যাঁ এটি 100% উত্তরাধিকার নয় তবে এটি পিতামাতার কাছ থেকে ইন্টারফেসটি ব্যবহার করছে
ক্রুসকভস্কি

5
public class A
{
    public int i = 0;
    internal virtual void test()
    {
        Console.WriteLine("A test");
    }
}

public class B : A
{
    public new int i = 1;
    public new void test()
    {
        Console.WriteLine("B test");
    }
}

public class C : B
{
    public new int i = 2;
    public new void test()
    {
        Console.WriteLine("C test - ");
        (this as A).test(); 
    }
}

3

গ্র্যান্ড বেস ফাংশনটি কল করতে আপনি প্রথম স্তর থেকে প্রাপ্ত ক্লাসে একটি সাধারণ ফাংশনও করতে পারেন


ঠিক ঠিক তাই, এবং এটি পুরো বিমূর্ততা স্কিমটি সংরক্ষণ করে যার সম্পর্কে সবাই চিন্তিত এবং এটি অ্যাবস্ট্রাকশন স্কিমগুলি যেভাবে মূল্যবান হওয়ার চেয়ে কখনও কখনও আরও বেশি সমস্যায় পড়ে তা হাইলাইট করে।
শাওয়াইস

3

এর জন্য আমার 2 সিটি আপনাকে একটি সরঞ্জামদণ্ডের ক্লাসে ডেকে আনতে হবে এমন কার্যকারিতা বাস্তবায়ন করা এবং যেখানেই আপনার প্রয়োজন সেখানে থেকে কল করুন:

// Util.cs
static class Util 
{
    static void DoSomething( FooBase foo ) {}
}

// FooBase.cs
class FooBase
{
    virtual void Do() { Util.DoSomething( this ); }
}


// FooDerived.cs
class FooDerived : FooBase
{
    override void Do() { ... }
}

// FooDerived2.cs
class FooDerived2 : FooDerived
{
    override void Do() { Util.DoSomething( this ); }
}

সুবিধার অ্যাক্সেসের জন্য এটির জন্য কিছু চিন্তাভাবনা প্রয়োজন internal, কার্যকারিতাটি সহজ করার জন্য আপনার কিছু এক্সেসরের পদ্ধতি যুক্ত করতে হতে পারে ।


1

ক্ষেত্রে যেখানে আপনার উদ্ভূত শ্রেণীর উত্সের অ্যাক্সেস নেই, তবে বর্তমান পদ্ধতি ছাড়াও উদ্ভূত শ্রেণীর সমস্ত উত্সের প্রয়োজন আছে, তবে আমি আপনাকে সুপারিশ করব যে আপনি একটি উদ্ভূত বর্গও করেন এবং উত্পন্ন শ্রেণীর বাস্তবায়ন কল করুন।

এখানে একটি উদাহরণ:

//No access to the source of the following classes
public class Base
{
     public virtual void method1(){ Console.WriteLine("In Base");}
}
public class Derived : Base
{
     public override void method1(){ Console.WriteLine("In Derived");}
     public void method2(){ Console.WriteLine("Some important method in Derived");}
}

//Here should go your classes
//First do your own derived class
public class MyDerived : Base
{         
}

//Then derive from the derived class 
//and call the bass class implementation via your derived class
public class specialDerived : Derived
{
     public override void method1()
     { 
          MyDerived md = new MyDerived();
          //This is actually the base.base class implementation
          MyDerived.method1();  
     }         
}

0

পূর্ববর্তী পোস্টগুলি থেকে দেখা যায়, কেউ যুক্তি দিতে পারে যে শ্রেণীর কার্যকারিতাটি যদি সংশোধন করা দরকার তবে শ্রেণীর আর্কিটেকচারে কিছু ভুল আছে। এটি সত্য হতে পারে, তবে একটি বড় পরিপক্ক প্রকল্পে সর্বদা শ্রেণি কাঠামো পুনর্গঠন বা পুনরায় কারক করা যায় না। পরিবর্তন পরিচালনার বিভিন্ন স্তরের একটি সমস্যা হতে পারে তবে রিফ্যাক্টরিংয়ের পরে বিদ্যমান কার্যকারিতাটি একইভাবে চালিত রাখা সর্বদা তুচ্ছ কাজ নয়, বিশেষত সময় সীমাবদ্ধতা প্রয়োগ করে। একটি পরিপক্ক প্রকল্পে কোডের পুনর্গঠনের পরে বিভিন্ন রেগ্রেশন টেস্টগুলি পাস করা থেকে রক্ষা করা বেশ উদ্যোগী হতে পারে; প্রায়শই অস্পষ্ট "অদ্ভুততা" থাকে যা প্রদর্শিত হয়। কিছু ক্ষেত্রে আমাদের একই সমস্যা ছিল উত্তরাধিকার সূত্রে প্রাপ্ত কার্যকারিতাটি কার্যকর করা উচিত নয় (বা অন্য কিছু করা উচিত)। আমরা নীচে অনুসরণ করা পদ্ধতির, বেস কোডটি ছিল যা আলাদা ভার্চুয়াল ফাংশনে বাদ দিতে হবে। এই ফাংশনটি পরে উত্পন্ন ক্লাসে ওভাররাইড করা যেতে পারে এবং কার্যকারিতা বাদ দেওয়া বা পরিবর্তন করা যেতে পারে। এই উদাহরণে "পাঠ্য 2" আটকানো শ্রেণীর আউটপুট থেকে রোধ করা যেতে পারে।

public class Base
{
    public virtual void Foo()
    {
        Console.WriteLine("Hello from Base");
    }
}

public class Derived : Base
{
    public override void Foo()
    {
        base.Foo();
        Console.WriteLine("Text 1");
        WriteText2Func();
        Console.WriteLine("Text 3");
    }

    protected virtual void WriteText2Func()
    {  
        Console.WriteLine("Text 2");  
    }
}

public class Special : Derived
{
    public override void WriteText2Func()
    {
        //WriteText2Func will write nothing when 
        //method Foo is called from class Special.
        //Also it can be modified to do something else.
    }
}

0

এই প্রশ্নগুলির অনেকগুলি মনে হয় গ্র্যান্ডপ্রেંટ ক্লাস থেকে সদস্য পদ্ধতি উত্তরাধিকার সূত্রে প্রাপ্ত হয়, এটি দ্বিতীয় শ্রেণিতে ওভাররাইড করে, তারপরে গ্র্যান্ডচাইল্ড ক্লাস থেকে তার পদ্ধতিটি আবার কল করে। শুধু পিতামাতার সদস্যদের নাতি-নাতনিদের কাছে উত্তরাধিকারী করে তোলেন না কেন?

class A
{
    private string mystring = "A";    
    public string Method1()
    {
        return mystring;
    }
}

class B : A
{
    // this inherits Method1() naturally
}

class C : B
{
    // this inherits Method1() naturally
}


string newstring = "";
A a = new A();
B b = new B();
C c = new C();
newstring = a.Method1();// returns "A"
newstring = b.Method1();// returns "A"
newstring = c.Method1();// returns "A"

সহজ বলে মনে হচ্ছে .... নাতি-নাতনী এখানে দাদা-দাদি পদ্ধতি উত্তরাধিকার সূত্রে প্রাপ্ত। এটি সম্পর্কে চিন্তা করুন ..... এভাবেই "অবজেক্ট" এবং টোস্ট্রিংয়ের মতো এর সদস্যরা সি # তে সমস্ত শ্রেণিতে উত্তরাধিকার সূত্রে প্রাপ্ত। আমি ভাবছি মাইক্রোসফ্ট বেসিক উত্তরাধিকার ব্যাখ্যা করার জন্য ভাল কাজ করেনি। পলিমারফিজম এবং বাস্তবায়নের উপর খুব বেশি ফোকাস রয়েছে। আমি যখন তাদের ডকুমেন্টেশনের মাধ্যমে খনন করি তখন এই খুব প্রাথমিক ধারণাটির কোনও উদাহরণ নেই। :(


-2

আপনি যদি বেস ক্লাসের ডেটাতে অ্যাক্সেস করতে চান তবে আপনাকে অবশ্যই "এই" কীওয়ার্ডটি ব্যবহার করতে হবে বা আপনি এই কীওয়ার্ডটি শ্রেণীর রেফারেন্স হিসাবে ব্যবহার করেন।

namespace thiskeyword
{
    class Program
    {
        static void Main(string[] args)
        {
            I i = new I();
            int res = i.m1();
            Console.WriteLine(res);
            Console.ReadLine();
        }
    }

    public class E
    {
        new public int x = 3;
    }

    public class F:E
    {
        new public int x = 5;
    }

    public class G:F
    {
        new public int x = 50;
    }

    public class H:G
    {
        new public int x = 20;
    }

    public class I:H
    {
        new public int x = 30;

        public int m1()
        {
           // (this as <classname >) will use for accessing data to base class

            int z = (this as I).x + base.x + (this as G).x + (this as F).x + (this as E).x; // base.x refer to H
            return z;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.