هل يمكنني منع تجاوز الطريقة الافتراضية الموروثة في الفئات الفرعية؟

StackOverflow https://stackoverflow.com/questions/43511

  •  09-06-2019
  •  | 
  •  

سؤال

لدي بعض الفصول وضعت مثل هذا

class A
{
    public virtual void Render()
    {
    }
}
class B : A
{
    public override void Render()
    {
        // Prepare the object for rendering
        SpecialRender();
        // Do some cleanup
    }

    protected virtual void SpecialRender()
    {
    }
}
class C : B
{
    protected override void SpecialRender()
    {
        // Do some cool stuff
    }
}

هل من الممكن منع فئة C من تجاوز طريقة العرض دون كسر الكود التالي؟

A obj = new C();
obj.Render();       // calls B.Render -> c.SpecialRender
هل كانت مفيدة؟

المحلول

يمكنك إغلاق الطرق الفردية لمنع تجاوزها:

public sealed override void Render()
{
    // Prepare the object for rendering        
    SpecialRender();
    // Do some cleanup    
}

نصائح أخرى

نعم، يمكنك استخدام الكلمة الأساسية المختومة في تنفيذ Render للفئة B:

class B : A
{
    public sealed override void Render()
    {
        // Prepare the object for rendering
        SpecialRender();
        // Do some cleanup
    }

    protected virtual void SpecialRender()
    {
    }
}

في ب، افعل

protected override sealed void Render() { ... }

يحاول sealed

class B : A
{
  protected sealed override void SpecialRender()
  {
    // do stuff
  }
}

class C : B
  protected override void SpecialRender()
  {
    // not valid
  }
}

بالطبع، أعتقد أن C يمكنه الالتفاف حوله من خلال كونه new.

نعم.إذا قمت بوضع علامة على إحدى الطرق على أنها مختومة، فلا يمكن تجاوزها في فئة مشتقة.

من المحتمل أن تكون هناك طريقة أخرى (أفضل؟) تستخدم الكلمة الأساسية الجديدة لمنع تجاوز طريقة افتراضية معينة:

class A
{
    public virtual void Render()
    {
    }
}
class B : A
{
    public override void Render()
    {
        // Prepare the object for rendering       
        SpecialRender();
        // Do some cleanup    
    }
    protected virtual void SpecialRender()
    {
    }
}
class B2 : B
{
    public new void Render()
    {
    }
}
class C : B2
{
    protected override void SpecialRender()
    {
    }
    //public override void Render() // compiler error 
    //{
    //}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top