2010-04-14 9 views
8

개인 생성자가 외부 세계에서 개체를 생성하지 못한다고 들었습니다.개인 생성자 및 공용 매개 변수 생성자

내가 코드 여기

public class Product 
{ 
    public string Name { get;set;} 
    public double Price {get;set;} 
    Product() 
    { 
    } 

    public Product(string _name,double _price) 
    { 
    } 
} 

난 아직도 public 생성자 (매개 변수)를 선언 할 수 있습니다, 그것은 개인 생성자의 목적을 해치지 않을 것 있나요? 코드에 private 및 public 생성자 (매개 변수)가 필요한 경우는 언제입니까?

자세한 설명이 필요합니다.

답변

5

설명하는 패턴을 사용하는 이유는 개체가 인스턴스화되는 것을 제어하려는 경우입니다.

예를 들어, 제품을 만드는 방법은 이름과 가격을 지정하는 것입니다. 이것은 외부 세계와 관련한 것입니다. 당신은 다른 접근 수정자를 사용하여 비슷한 것을 할 수도 있고, 다른 의미를 가질 수도 있지만, 누가 그 일을 할 것인지에 관해 객체를 인스턴스화하는 방법을 제어하는 ​​것으로 끝납니다.

개체 생성을 모두 막으려면 모든 생성자를 비공개 (또는 보호)해야합니다. 그러면 객체 자체가 강제로 생성됩니다 (또는 상속 된 클래스).

또한 Matti가 아래 주석에서 지적했듯이 매개 변수화 된 생성자를 정의 할 때 개인 기본 생성자를 지정할 필요가 없습니다. 그 시점에서 그것은 함축되어 있습니다.

+4

자동으로 기본 매개 변수가없는 생성자의 생성을 비활성화합니다. –

0

클래스의 인스턴스를 만들기 위해 호출 코드가 값을 생성자에 전달하도록하려는 경우 매개 변수가있는 생성자를 사용합니다. 귀하의 예제에서 호출 코드는 Product을 생성하기 위해 생성자의 매개 변수 버전을 사용해야합니다.

2

클래스 내에서 해당 생성자 만 호출되도록하려면 개인 생성자가 필요합니다. 위의 예제에서 객체를 생성 할 때 호출 객체가 2 개의 매개 변수를 제공하도록 강요합니다. 매개 변수가없는 생성자를 호출 할 수있는 객체를 제외하고

public static GetInstance() 
{ 
    return new YourObject(); 
} 

하지만 아무것도 : 당신이 뭔가를 할 수있는 개인 생성자와

.

일반적으로 싱글 톤 패턴을 생성하는 데 사용 :

http://www.dofactory.com/Patterns/PatternSingleton.aspx

4

생성자는 아무도 를 호출하기로되어 있지 않은지 개인 생성자를 가지고 매우 흔한, 그래서 코드를 복제하는 것을 방지하기 위해, 서로 연결 할 수 있습니다 클래스의 외부에 있지만, 각 public 생성자는 다음에 연결됩니다.

예 :

public class Test 
{ 
    private Test(int? a,string b) { } 
    public Test(int a) : this(a, null) { } 
    public Test(string b) : this(null, b) { } 
} 

여기가 int를 가지고 두 public 생성자 한 문자열을 취득하고, 하나, 두 인자를 공통 전용 생성자 둘 체인.

또한, 물론, 당신은, 개인 생성자를 사용하여 같은 클래스 내에서 새로운 객체를 구성 할 수 있습니다 예를 들어 당신이 정적 팩토리 메소드를 통해서만 가능한 전문 생성자를 할 수 있습니다 :

여기
public static Test Create() 
{ 
    int? a = ReadConfigurationForA(); 
    string b = ReadConfigurationForB(); 
    return new Test(a, b); 
} 

이되지 수도 개인 생성자를 외부에 노출시키는 것이 좋습니다. 대신 생성자를 전달할 올바른 인수를 반입하는 정적 팩토리 메소드를 추가하십시오.

0

개인 생성자는 특별한 인스턴스 생성자입니다. 정적 멤버 만 포함하는 클래스에서 주로 사용됩니다. 클래스에 하나 이상의 private 생성자가 있고 public 생성자가없는 경우 다른 클래스 (중첩 클래스 제외)는이 클래스의 인스턴스를 만들 수 없습니다. 자세한 내용은

이 참조 :이 경우는 별도로 매개 변수가없는 생성자 개인이 필요하지 않은 선언에 있도록 매개 변수로 생성자를 정의 이 http://msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx