C#에서 정적 메서드 재정의

Saad Aslam 2023년10월12일
  1. C#에서 정적 메서드 재정의
  2. C#에서 정적 메서드를 재정의하는 다른 방법
C#에서 정적 메서드 재정의

이 문서에서는 추상 기본 클래스의 정적 메서드를 재정의하는 방법에 대해 설명합니다.

C#에서 정적 메서드 재정의

첫째, 추상 기본 클래스에 속하는 정적 메서드를 재정의할 수 없습니다. 그것은 C#에서 할 수 있는 일이 아닙니다.

이는 정적이라는 문구가 모든 사람에게 적용되는 것을 의미하는 반면, 우선적인 아이디어는 우리의 요구 사항에 따라 구현을 변경하기 위해 활용하는 것이기 때문입니다.

정적 메서드를 재정의하면 함께 제공되는 정적 속성이 손실됩니다. 따라서 C#의 정적 메서드는 재정의할 수 없습니다.

그러나 요구 사항을 충족하기 위해 규칙을 어기고 반대 순서로 작업을 수행할 수 있습니다.

C#에서 정적 메서드를 재정의하는 다른 방법

숨김은 사용할 수 있는 아이디어이며, 사용할 수 있습니다. 이 아이디어는 가상 기능을 구축할 때 사용되는 Early Binding 및 Late Binding에도 중요합니다.

가상 메서드 구현이 인스턴스를 기반으로 런타임에 선택되면 이를 재정의라고 합니다. 빌드 시 이름이 같은 메서드를 두 개 이상 선택하면 오버로드라고 합니다.

오버로딩은 객체지향 다형성의 필수 요소라기보다 편리합니다.

정적 메서드를 오버로딩하는 것은 우선 재정의와 비슷할 수 있습니다. 컴파일러는 제공된 클래스에서 정적 메서드를 찾을 수 없는 경우 일치하는 메서드를 찾을 때까지 상속 구조에서 검색합니다.

이 메서드는 빌드 시 해결되고 수정되며 이는 주요 차이점입니다. 이는 진정한 재정의가 아니기 때문에 정적 메서드에 virtual, override 또는 new 레이블을 지정할 수 없습니다.

재정의 메서드의 동작은 Liskov 대체 원칙(LSP)을 준수해야 합니다. 보다 일반적으로 말하자면 재정의 메서드의 동작은 가상 메서드의 계약을 준수해야 합니다.

이러한 제약 조건은 오버로드된 정적 메서드에는 적용되지 않습니다. 이 메서드는 이름은 같지만 다른 기능을 제공하는 별개의 메서드로 더 정확하게 인식됩니다.

new 키워드는 이름은 같지만 동작이 다른 구성원을 설정합니다.

new 키워드를 사용하면 이 경고가 일반적으로 표시되지 않습니다. 또한 원할 때마다 부모의 숨겨진 메서드를 호출하기 위해 대리자를 활용할 필요조차 없다는 점을 명심하십시오. 당신이해야 할 일은 그들에게 그들의 전체 이름을 제공하는 것입니다.

C#에서 정적 메서드 숨기기 구현

using System;

class Hi {
  static void Main() {
    C2.Calldisplay();
  }
}

class C1 {
  public static void display() {
    System.Console.WriteLine("Class 1 it is");
  }
}
class C2 : C1 {
  public static void display() {
    System.Console.WriteLine("Class 2 it is");
  }
  public static void Calldisplay() {
    display();
    C1.display();
  }
}

출력:

Class 2 it is
Class 1 it is

display() 메서드는 C1.display()를 호출하는 C2 클래스에 의해 C1 클래스에서 상속됩니다. C1 클래스에서 상속된 C2 클래스의 C1.display()라는 함수는 부모의 숨겨진 정적 메서드인 C1 클래스를 호출합니다.

인스턴스에서 정적 메서드를 호출할 수 없고 해당 메서드가 속한 유형의 이름을 제공하여 호출해야 한다는 사실은 우리가 보기에 메서드를 숨기는 관행을 정당화합니다. 메서드에 대한 가장 중요한 결정은 정적 메서드, 인스턴스 메서드 또는 가상 메서드여야 하는지 여부입니다.

용어를 사용하는 결과는 다형성을 유지할 수 없다는 것입니다. 특정 행동을 재해석하는 데 도움이 될 수 있지만 매우 주의해서 사용해야 하며 사용 방법과 장소에 대해 매우 신중해야 합니다.

재정의된 속성을 호출하는 동안 기본 클래스를 보는 사람은 현재 버전이 아닌 이전 버전의 속성을 얻게 됩니다.

부분 클래스는 언어에서 부과하는 제한 사항이므로 어셈블리 간에 지정할 수 없다는 점을 기억하는 것이 중요합니다.

이상적인 세상에서는 이를 사용하여 광범위한 클래스를 여러 파일로 분할해야 합니다(그렇지 않으면 잘못된 작업을 수행할 수 있음). 때때로 코드를 공유하여 크로스 플랫폼 개발을 용이하게 할 수 있습니다(모든 코드가 모든 플랫폼에서 작동하는 것은 아니기 때문입니다).

여러 플랫폼용으로 개발하는 경우 해당 상황에서 이 전략을 활용할 수 있습니다. 그러나 클래스를 모델링하는 다른 방법을 찾아야 합니다. 부상에 모욕을 더하기 위해 그것은 완전히 읽을 수 없습니다!

부분 클래스가 사용될 때 모든 구성 요소에 대한 확장 검색이 있는 것이 일반적입니다. 이것은 초보자가 무슨 일이 일어나고 있는지 이해하기 어렵게 만드는 것 외에는 아무것도 하지 않습니다.

이런 식으로 작업을 수행하면 다른 방법을 사용하여 추상 기본 클래스의 정적 메서드를 재정의하는 작업을 완료할 수 있습니다.

작가: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn

관련 문장 - Csharp Method