문제

C# 프로그램에는 정적 "Create"메소드가있는 추상적 인 기본 클래스가 있습니다. Create Method는 클래스의 인스턴스를 작성하고 나중에 사용하기 위해 로컬로 저장하는 데 사용됩니다. 기본 클래스는 추상적이므로 구현 오브젝트는 항상 그에서 파생됩니다.

기본 클래스에서 객체를 도출하고 파생 클래스를 통해 정적 생성 메소드 (기본 클래스에서 한 번 구현)를 호출하고 파생 된 객체의 인스턴스를 만들 수 있기를 원합니다.

C# 언어 내에 시설이 있습니까? 현재의 폴백 위치는 파생 클래스의 인스턴스를 생성 함수의 인수 중 하나로 전달하는 것입니다.

objDerived.Create(new objDerived(), "Arg1", "Arg2");
도움이 되었습니까?

해결책

제네릭을 사용해보십시오 :

public static BaseClass Create<T>() where T : BaseClass, new()
{
    T newVar = new T();
    // Do something with newVar
    return T;
}

샘플 사용 :

DerivedClass d = BaseClass.Create<DerivedClass>();

다른 팁

요약

두 가지 주요 옵션이 있습니다. 더 좋고 새로운 것은 제네릭을 사용하는 것입니다. 다른 하나는 반사를 사용하는 것입니다. .NET 2.0 이전에 작동하는 솔루션을 개발 해야하는 경우 두 가지를 모두 제공하고 있습니다.

제네릭

abstract class BaseClass
{
  public static BaseClass Create<T>() where T : BaseClass, new()
  {
    return new T();
  }
}

사용이있는 곳 :

DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();

반사

abstract class BaseClass
{
  public static BaseClass Create(Type derivedType)
  {
    // Cast will throw at runtime if the created class
    // doesn't derive from BaseClass.
    return (BaseClass)Activator.CreateInstance(derivedType);
  }
}

사용이 어디에 있는지 (가독성을 위해 두 줄에 분할) :

DerivedClass derivedClass
    = (DerivedClass)BaseClass.Create(typeof(DerivedClass));

추상 기본 클래스에서 정적 공장 메소드를 사용하여 파생 된 다른 인스턴스 내부에서 파생 된 새 인스턴스를 만들고 싶습니까? 그렇다면 왜 그런지 궁금합니다 ...하지만 ...

 public abstract class MyBase
 {
    public static T GetNewDerived<T>() where T : MyBase, new()
    {
        return new T();
    }    
 }
 public class DerivedA : MyBase
 {
    public static DerivedA GetNewDerived()
    {
        return GetNewDerived<DerivedA>();
    }
 }

 public class DerivedB : MyBase
 {
    public static DerivedB GetNewDerived()
    {
        return GetNewDerived<DerivedB>();
    }
 }     

이것이 당신이 원하는 것입니까?

Create () 메소드를 추상화 해야하는 것 같습니다. 그리고 일단 당신이 그렇게하면 당신은 그것을 이름 바꾸고 생성자로 만들 수도 있습니다. 그런 다음 필요한 경우 객체를 구성한 후 호출하는 다른 init () 메소드를 가질 수 있으며 정상적인 다형성 효과는 사물을 처리합니다.

외부 정보 없이는 할 수 없습니다. 파생 클래스의 유형, IT 인스턴스 또는 파생 클래스의 완전히 자격이있는 이름입니다. 이들 중 하나는 이미하고있는 일과 같습니다. 내가 알고있는 더 나은 솔루션은 없습니다. 정적 방법의 본질은 더 우아한 것을 배제합니다.

나는 당신의 디자인 목표가 무엇인지 확실하지 않지만 당신이 요청한 것에서 그것은 많은 코드 냄새로 끝날 수있는 것처럼 들립니다. Microsoft Unity, Castle Windsor, StructureMap, Nineject, Spring.net 등과 같은 수많은 프레임 워크에서 구현되는 Control (IOC) / Dependency Injection (DI) 설계 패턴을 실제로 살펴 봐야한다고 생각합니다.

IOC 컨테이너를 사용하는 것을 보면 훨씬 깨끗하고 느슨하게 결합 된 방식으로 문제를 해결할 것이라고 생각합니다.

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