C#의 상속자가 기본 생성자가 호출되는 것을 방지하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/159296

문제

프록시 객체로 감싸고 싶은 (제대로 쓰여진) 기본 클래스가 있습니다. 기본 클래스는 다음과 비슷합니다.

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   public BaseClass(int someValue) {}

   //...more code, not important here
}

그리고 내 프록시는 다음과 비슷합니다.

public BaseClassProxy : BaseClass
{
  public BaseClassProxy(bool fakeOut){}
}

"가짜"생성자가 없으면 기본 생성자가 호출 될 것으로 예상됩니다. 그러나 그것으로, 나는 그것이 호출되지 않을 것으로 예상했다. 어느 쪽이든, 나는 기본 클래스 생성자를 호출하지 않는 방법이 필요 하거나이 (사악한) 클래스를 효과적으로 프록시하는 다른 방법이 필요합니다.

도움이 되었습니까?

해결책

기본 클래스에서 생성자를 명시 적으로 호출하지 않으면 매개 변수가없는 생성자를 암시 적으로 호출합니다. 그 주위에 방법이 없으며, 생성자를 호출하지 않으면 클래스를 인스턴스화 할 수 없습니다.

다른 팁

전화하지 않고 개체를 만들 수있는 방법이 있습니다. 어느 인스턴스 생성자.

진행하기 전에 이런 식으로하고 싶다고 확신하십시오. 시간의 99%는 잘못된 솔루션입니다.

이것이 당신이하는 방법입니다.

FormatterServices.GetUninitializedObject(typeof(MyClass));

물체 생성자 대신에 호출하십시오. 생성자 또는 필드 초기화기를 호출하지 않고 인스턴스를 생성하고 반환합니다.

WCF의 객체를 제조하면이 방법을 사용하여 객체를 만듭니다. 이 경우 생성자 및 필드 초기화기조차 실행되지 않습니다.

최소 1 개의 CTOR를 호출해야합니다. 내가 보는 유일한 방법은 격리입니다. 수업을 내부에 있거나 다른 클래스를 참조하십시오.

당신이 원하는 것이라면 ~ 아니다 두 기본 클래스 생성자 중 하나를 호출하면이 작업을 수행 할 수 없습니다.

C# 클래스 생성자는 기본 클래스 생성자를 호출해야합니다. 명시 적으로 전화하지 않으면 베이스 () 암시된다. 예에서 호출 할 기본 클래스 생성자를 지정하지 않으면 다음과 같습니다.

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base() { }
}

다른 기본 클래스 생성자를 사용하려면 다음을 사용할 수 있습니다.

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base(someIntValue) { }
}

어느 쪽이든, 둘 중 하나 ~ 할 것이다 명시 적으로 또는 암시 적으로 부름을받습니다.

나는 당신이 생성자를 부를 수 있다고 생각하지 않습니다. 그러나 당신은 다음과 같은 일을 할 수 있습니다.

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   protected virtual void Setup()
   {
   }
}

public BaseClassProxy : BaseClass
{
   bool _fakeOut;
   protected BaseClassProxy(bool fakeOut)
   {
        _fakeOut = fakeOut;
        Setup();
   }

   public override void Setup()
   {
       if(_fakeOut)
       {
            base.Setup();
       }
       //Your other constructor code
   }
} 

BaseClassProxy 객체를 만들 때 기본 클래스의 인스턴스를 만들어야하므로 기본 클래스 생성자를 호출해야합니다. 두 번째로 호출 할 수있는 것은 다음과 같이 호출 할 수 있습니다.

public BaseClassProxy (bool fakeOut) : base (10) {}

첫 번째 생성자 대신 두 번째 생성자를 호출하려면

기본 호출 생성자가 옵션이 아님을 두려워합니다.

나는 다음과 같은 일을하게되었습니다.

public class BaseClassProxy : BaseClass 
{
   public BaseClass BaseClass { get; private set; }

   public virtual int MethodINeedToOverride(){}
   public virtual string PropertyINeedToOverride() { get; protected set; }
}

이것은 기본 클래스의 나쁜 관행 중 일부를 가졌습니다.

생성자는 본질적으로 공개적입니다. 생성자를 사용하지 말고 구조에 다른 제품을 사용하지 말고 비공개로 만드십시오. 따라서 매개 변수가없는 인스턴스를 생성하고 객체 인스턴스를 구성하기 위해 해당 함수를 호출합니다.

좋아, 여기에, 다른 클래스의 생성자를 물려받는 한 클래스의 문제에 대한 추악한 해결책이 있습니다. 나는 수업에서 이것을 사용하지 않기를 바랐지만 여기서는 다음과 같습니다.

내 클래스 생성자는 다음과 같습니다.

public MyClass();
{
   throw new Exception("Error: Must call constructor with parameters.");
}

좋아, 이제 당신은 그것이 못 생겼다는 경고를 받았습니다. 불만이 없습니다!

매개 변수가없는 상속 된 기본 생성자를 허용하지 않고 주 생성자로부터 최소한의 매개 변수를 강제하고 싶었습니다.

또한 생성자를 생성하고 다음을 수행하지 않으면 기본 클래스 생성자를 호출하지 않을 것이라고 생각합니다. 그리고 기본 클래스의 모든 것들에 대한 생성자를 생성하고 메인 클래스에서 동일한 매개 변수를 제공하는 경우 통과하지 못합니다. 그러나 기본 클래스에 많은 생성자가 있다면 이것은 지루할 수 있습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top