제로의영역

7.12 오버라이딩 봉인하기 본문

C#

7.12 오버라이딩 봉인하기

아이큐제로 2019. 6. 5. 18:05

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

 (1) 정의: 메소드가 오버라이딩(재정의) 되지 않도록 하는 행위

 

 (2) 용도

  1) 자식 클래스에서 오버라이딩 했을 경우 오작동을 일으킬 수 있는 부모클래스의 메소드를 봉인할 때 사용.

  2) 오버라이딩한 메소드는 파생 클래스의 파생 클래스에서도 자동으로 오버라이딩이 가능하기 때문에 virtual로 선언

   된 메소드만 봉인하는 기능이 있음.

  3) 봉인 메소드는 파생 클래스의 작성자를 위한 기반 클래스 작성자의 배려로 다음 상황을 막기위해 사용.

   A. 파생클래스의 작성자가 기반 클래스로부터 상속받은 메소드 하나를 오버라이딩 한 경우, 이로 인해 파생클래스의 

     다른 부분들이 오작동을 하게 되는 경우.

 

 (3) 사용법

  1) virtual로 선언된 가상 메소드를 오버라이딩한 버전의 메소드만 가능(또 시작이네요. 이게 뭔소리인가요?)

    >> 해석: 부모 클래스에서 virtual로 선언된 메소드를 오버라이딩한 자식클래스의 메소드에서만 가능(손자 클래스(?)등에서 오버라이딩하는 방지)

   2) 자식 클래스의 오버라이딩한 메소드를 sealed로 수식

    한정자+sealed+override+반환형식+메소드이름(변수) 

 

 예제)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ex7_13
{
    class Parents
    {
        public virtual void SealMe()            //오버라이드가 가능하도록 virtual로 수식
        {

        }
    }

    class Child:Parents                         //상속
    {
        public sealed override void SealMe()    //오버라이드(재정의)하였지만 다른 상속자들이 사용할 수 없도록 sealed로 수식
        {
            base.SealMe();                      //visual studio 2019에서 사용하니 자동으로 생성됨
        }
    }
    class WantToOverrid:Child                   //자식클래스를 한번 더 상속
    {
        public override void SealMe()           //오버라이드 시도
        {

        }
    }
    class MainProgram
    {
        static void Main(string[] args)
        {
        }
    }
}

 출력결과는 아래 에러가 표시되며 출력안됨

: 오류 CS0239 'WantToOverrid.SealMe()': 상속된 'Child.SealMe()' 멤버는 봉인되어 있으므로 재정의할 수 없습니다.