programing

왜 우리는 개인 건설업자가 필요합니까?

codeshow 2023. 8. 15. 11:48
반응형

왜 우리는 개인 건설업자가 필요합니까?

클래스에 개인 생성자가 있으면 인스턴스화할 수 없습니다.따라서 수업을 인스턴스화하고 계속 사용하지 않으려면 정적으로 만들 수 있습니다.

개인 건설자의 용도는 무엇입니까?

또한 싱글톤 클래스에서 사용하는 것인데, 그 외에 다른 용도는 없나요?

(참고: 위의 싱글톤 케이스를 제외한 이유는 정적 클래스가 있는데 왜 싱글톤이 필요한지 전혀 이해가 되지 않기 때문입니다.제가 질문에 혼란을 겪었기 때문에 당신은 이것에 대답하지 않을 수도 있습니다.)

공장

개인 생성자는 공장 패턴(즉, 명시적 인스턴스화가 아닌 클래스의 인스턴스를 가져오는 데 사용되는 정적 함수)을 사용할 때 유용합니다.

public class MyClass
{ 
    private static Dictionary<object, MyClass> cache = 
        new Dictionary<object, MyClass>();

    private MyClass() { }

    public static MyClass GetInstance(object data)
    {
        MyClass output;

        if(!cache.TryGetValue(data, out output)) 
            cache.Add(data, output = new MyClass());

        return output;           
    }
}

중첩된 자식을 사용하여 유사 밀봉

외부 클래스에서 상속되는 중첩 클래스는 전용 생성자에 액세스할 수 있습니다.

예를 들어, 이를 사용하여 상속할 수 있지만 다른 사용자는 상속할 수 없는 추상 클래스를 만들 수 있습니다.internal하지만, 생자는또상한속단제로리것만위이지작업할여기서해기한성하셈일블,private생성자는 모든 구현을 중첩된 클래스로 만듭니다.)

public abstract class BaseClass
{
    private BaseClass() { }

    public class SubClass1 : BaseClass
    {
        public SubClass1() : base() { }
    }

    public class SubClass2 : BaseClass
    {
        public SubClass2() : base() { }
    }
}

기본 생성자

또한 액세스하기 쉬운 다른 생성자에서 호출되는 "기본" 생성자를 만드는 데 사용할 수 있습니다.

public class MyClass
{
    private MyClass(object data1, string data2) { }

    public MyClass(object data1) : this(data1, null) { }

    public MyClass(string data2) : this(null, data2) { }

    public MyClass() : this(null, null) { }
}

Stefan, Adam 및 다른 사람들이 지적했듯이, 개인 생성자는 클래스 외부의 코드에 의해 클래스가 생성되는 것이 바람직하지 않은 경우에 유용합니다.싱글톤, 팩토리, 정적 메소드 객체는 유형의 구성을 제한할 수 있는 것이 특정 패턴을 적용하는 데 유용한 예입니다.

정적 클래스가 존재하는 경우 싱글톤이 필요한 이유에 대한 질문의 두 번째 부분에 답하려면 싱글톤과 정적 클래스는 동일하지 않습니다.

예를 들어, 싱글톤 클래스는 인터페이스를 구현할 수 있지만 정적 클래스는 구현할 수 없습니다.싱글톤 객체는 매개 변수로 메소드에 전달될 수 있습니다. 이것은 래퍼 객체나 반사에 의존하지 않고 정적 클래스를 사용하는 것은 그리 쉽지 않습니다.하나 이상의 리프 클래스가 싱글톤인 상속 계층을 만들 수도 있지만 정적 클래스에서는 불가능합니다.다른 예로, 여러 개의 다른 싱글톤이 있을 수 있으며 환경 또는 구성 매개 변수를 기반으로 런타임에 그 중 하나를 인스턴스화할 수도 있습니다. 이는 정적 클래스에서는 불가능합니다.

언어 기능을 이해하고 업무에 적합한 언어를 선택하는 것은 중요합니다. 언어 기능에는 이유가 있습니다.

때때로 당신은 수업을 인스턴스화할 수 없어야 합니다.이렇게 하면 이 작업이 명시적으로 수행되고 컴파일러 수준에서 수행됩니다.

싱글톤은 하나의 사용 사례에 불과합니다.상수 클래스, 정적 메서드 클래스 및 기타 유형의 패턴은 클래스를 인스턴스화할 수 없도록 지정합니다.

클래스 내에 개인 생성자를 만드는 목적

  1. 상속되는 클래스를 제한합니다.

  2. 클래스가 인스턴스화되거나 여러 인스턴스/개체를 만드는 것을 제한합니다.

  3. 싱글톤 디자인 패턴을 달성합니다.

    public class TestPrivateConstructor
    {
        private TestPrivateConstructor()
        {  }
    
        public static int sum(int a , int b)
        {
            return a + b;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            // calling the private constructor using class name directly 
            int result = TestPrivateConstructor.sum(10, 15);
            // TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class
        }
    }
    

이를 사용하여 싱글톤 인스턴스를 강제로 실행하거나 공장 클래스를 만들 수 있습니다.

정적 메서드는 전용 생성자를 호출하여 해당 클래스의 새 인스턴스를 만들 수 있습니다.

예를 들어 싱글톤 인스턴스:

public class Foo
{

  private Foo (){}

  private Foo FooInstance {get;set;}

  public static Foo GetFooInstance ()
  {
    if(FooInstance == null){
      FooInstance = new Foo();
    }

    return FooInstance;
  }

}

이렇게 하면 클래스 인스턴스를 하나만 만들 수 있습니다.

만약 당신의 유일한 목표가 그것이 인스턴스화되는 것을 원하지 않는다면, 그것을 정적으로 만드는 것으로 충분합니다.

클래스 외부에서 인스턴스화하지 않으려면(사용자가 클래스의 정적 팩토리를 사용하여 하나만 얻기를 원할 수도 있음), 공개적으로 액세스할 수 있는 정적 팩토리가 인스턴스화할 수 있도록 개인 의사가 필요합니다.

역사적으로 클래스를 정적으로 만드는 것이 항상 있었던 것은 아니라는 것을 기억하십시오.cctor를 비공개로 하는 것은 정적 키워드를 클래스에 적용하기 전에 인스턴스화할 수 없도록 하는 방법이었습니다.

싱글톤과 관련하여 - 싱글톤은 환경과 요구 사항이 패턴 사용에 대한 유사한 동기를 충족할 때 사용되는 설계 패턴입니다. 정적 클래스는 언어 기능입니다.

LBushkin의 답변이 논의하듯이 싱글톤 사용의 목표 중 일부는 정적 클래스를 사용하여 충족될 수 있지만, 싱글톤의 특정 구현은 정적 클래스의 특징 집합만을 초과할 수 있습니다.

클래스에 전용 생성자가 있으면 외부에서 인스턴스화할 수 없습니다.

서명이 다른 개인 생성자 및 공용 생성자를 가질 수도 있습니다.

클래스에 대한 팩토리를 만들려면 전용 생성자를 사용하고 정적 "팩토리" 메서드를 클래스 자체에 추가하여 클래스를 만들 수 있습니다.

예를 들어 시작* 메서드가 있는 그래픽 클래스가 있습니다.

개인 생성자는 특수 인스턴스 생성자입니다.그리고 정적 멤버만 있는 클래스를 만드는 경우에 사용되므로 이 클래스의 인스턴스를 만드는 것은 쓸모가 없으며, 여기서 개인 생성자가 작동합니다.

클래스에 하나 이상의 개인 생성자가 있고 공용 생성자가 없는 경우 중첩된 클래스를 제외한 다른 클래스는 이 클래스의 인스턴스를 만들 수 없습니다.

예:

class LogClass {

  public static double e = Math.E;  //2.71828

  // Private Constructor:
  private LogClass() { 

 }  
}

빈 생성자를 선언하면 매개 변수 없는 생성자가 자동으로 생성되지 않습니다.

생성자와 함께 액세스 한정자를 사용하지 않는 경우, 기본적으로 여전히 비공개입니다.자세히 보기: https://qawithexperts.com/tutorial/c-sharp/32/private-constructor-in-c-sharp

언급URL : https://stackoverflow.com/questions/2585836/why-do-we-need-a-private-constructor

반응형