예제 - VB.NET의 클래스와 모듈 비교



vba 클래스 모듈 예제 (6)

VB.NET에서 공유 멤버 함수가있는 클래스 대신 모듈을 사용하는 것이 허용되는 관행으로 간주됩니까?

저는 Visual Basic 6.0의 잔여 물과 같은 느낌을 가지기 때문에 Modules을 피하는 경향이 있습니다. 더 이상 적합하지 않은 것 같습니다. 반면 공유 멤버 만 사용하여 모듈과 클래스를 사용하는 경우에는 별다른 차이가없는 것 같습니다. 자주 그 중 하나에 대한 필요성이 너무 많지는 않지만 때로는 간단한 해결책을 제시하는 상황이 있습니다.

나는 당신이 어떤 의견이나 선호도를 가지고 있는지 듣고 싶어합니다.


Answer #1

내 VB.NET 클래스 중 하나가 모든 공유 멤버를 가질 때이를 일치하는 (또는 다른 적절한) 네임 스페이스가있는 모듈로 변환하거나 클래스를 상속받지 못하고 생성 가능하지 않게 만듭니다.

Public NotInheritable Class MyClass1

   Private Sub New()
      'Contains only shared members.
      'Private constructor means the class cannot be instantiated.
   End Sub

End Class

Answer #2

모듈은 열거 형 및 일부 전역 변수, 상수 및 공유 함수를 저장하는 데 적합합니다. 그것의 아주 좋은 것 및 나는 그것을 수시로 사용한다. 선언 된 변수는 전체 프로젝트에서 볼 수 있습니다.


Answer #3

별도의 네임 스페이스에 두지 않으면 모듈을 피하는 것이 좋습니다. 왜냐하면 Intellisense에서 모듈의 메서드는 해당 네임 스페이스의 모든 곳에서 볼 수 있기 때문입니다.

그래서 ModuleName.MyMethod() 대신 어디서나 MyMethod() 팝업으로 끝나고 이런 종류의 캡슐화는 무효화됩니다. (적어도 프로그래밍 수준에서).

그래서 항상 공유 메서드로 클래스를 만들려고 노력하는 것이 훨씬 낫습니다.


Answer #4

확장 메서드를 만들려면 클래스가 아닌 모듈을 사용해야합니다. VB.NET에서는 또 다른 옵션을 알지 못합니다.

모듈 자신에 대한 내성을 갖기 때문에, 방금 Sub New() (Module) 및 Shared Sub New() 를 알아 내기 위해 몇 개의 보편적 인 코드를 추가하여 보편적 어셈블리를 해결하는 방법을 연구했습니다. 클래스)는 동일합니다. (모듈에 호출 할 수있는 Sub New() 도 있다는 것을 몰랐습니다!)

그래서 방금 EmbeddedAssembly.LoadAddHandler AppDomain.CurrentDomain.AssemblyResolve 행을 던져 Bob이 내 삼촌이되었습니다.

부록 : 아직 100 % 체크 아웃하지는 않았지만 Sub New() 가 클래스보다 모듈에서 다른 순서로 실행된다는 사실을 알았습니다. 일부 선언을 내부 메소드로 옮겨야한다는 사실에 지나지 않았습니다. 오류를 피하기 위해 외부에서.


Answer #5

Module 을 사용해도됩니다. ModuleClass 대체하기 위해 사용되지 않습니다. Module 은 자체 용도로 사용됩니다. Module 의 목적은 다음과 같은 목적으로 컨테이너로 사용하는 것입니다.

  • 확장 메소드,
  • 어떤 Class 와도 관련이없는 변수
  • 어떤 Class 에도 적합하지 않은 변수.

ModuleClass 와 같지 않습니다.

  • Module 로부터 상속,
  • Module 과의 Interface 구현,
  • 또한 Module 의 인스턴스를 만들 수도 없습니다.

Module 내부의 모든 내용은 Module 을 해당 이름으로 참조하지 않고 Module 어셈블리 내에서 직접 액세스 할 수 있습니다. 기본적으로 Module 의 액세스 수준은 Friend 입니다.


Answer #6

수업

  • 클래스는 객체 로 인스턴스화 될 수 있습니다.
  • 오브젝트 데이터는 인스턴스화 된 각 오브젝트마다 별도로 존재합니다.
  • 클래스는 인터페이스구현할 수 있습니다 .
  • 클래스 내에 정의 된 멤버는 클래스 의 특정 인스턴스 내에서 범위지정 되며 객체수명 동안 만 존재 합니다 .
  • 클래스 외부에서 클래스 멤버에 액세스하려면 Object.Member 형식의 정규화 된 이름사용해야 합니다.

모듈

  • 모듈 은 객체로 인스턴스화 될 수 없습니다 . 표준 모듈의 데이터 사본이 하나뿐이기 때문에 프로그램의 한 부분이 표준 모듈의 공용 변수를 변경하면 전체 프로그램에서 볼 수 있습니다.
  • 모듈 내에서 선언 된 멤버는 기본적 으로 공개적으로 액세스 할 수 있습니다 .
  • 모듈에 액세스 할 수있는 모든 코드에서 액세스 할 수 있습니다.
  • 즉, 표준 모듈의 변수는 프로젝트의 어느 곳에서나 볼 수 있고 프로그램 수명 동안 존재하기 때문에 효과적으로 전역 변수입니다.




vb.net