2014-09-29 4 views
2

필자는 자연스럽게 건망증이 생기기 때문에 잠시 동안 검색을 해왔으며, (추상적 인 클래스, 인터페이스 등?) 뭔가를 빌드하면 좋을 것이라고 생각했다. 내가 쓰는 수업.C# : 추상 클래스를 사용하여 생성자 서명을 강제로 사용 하시겠습니까?

특히 개체의 복제를보다 쉽게하기 위해 새로운 매개 변수에 자체로 입력 된 단일 매개 변수를 사용하는 생성자가 있어야합니다. 나는 이것에 대해 이야기하는 기사/질문을 보았습니다. 그러나이 특정 질문에 대해 물어 보지 못했습니다. 적어도 발견 할 수있는 다른 문항이나 질문을 충분히 이해하지 못했습니다. . 미리 사과드립니다.

나는 추상적 인 클래스, 인터페이스 등에서 생성자를 갖는 것은 실제로 아무 것도하지 않는다. 나는 단지 파생 클래스에서 생성자 서명에 대한 요구 사항을 정의하는 데 관심이 있습니다.

내 이상적인 클래스는 다음과 같이 보일 것이다 :

public class GoodClass 
{ 
    public GoodClass(GoodClass goodClass) 
    { 
     // copy components of goodClass to this instance 
    } 
} 

그래서, 내가 먼저 인터페이스를 연구하기 시작도 추상 클래스에 최대 읽기 시작했다. 아래 코드가 작동한다고 생각했지만 오류가 발생했습니다. 내가 할 수있는 일이 가능한거야? 내 모니터에 스티커 메모를 넣지 않고도 목표를 달성 할 수있는 다른 방법이 있습니까? :)

C++에서
abstract class SelfConstructor 
{ 
    abstract public SelfConstructor(SelfConstructor) { } 
} 

class NewClass : SelfConstructor 
{ 
    //Required by SelfConstructor: 
    public NewClass(NewClass newClass) 
    { 
     // copy components of newClass to this instance 
    } 
} 

답변

1

이 사례를 인식하고 "복사 생성자"가없는 경우 클래스를 강조 표시하는 ReSharper 플러그인을 작성할 수 있습니다. 이 파일은 편집중인 파일을 처리하고 하이라이트를 추가하는 daemon stage입니다. 파일의 추상 구문 트리를보고 IConstructorDeclaration의 모든 인스턴스를 찾은 다음 ParameterDeclarations 속성에서 생성자의 매개 변수를 가져올 수 있습니다. 당신은 하나 개의 매개 변수가있는 생성자가 있다는 것을 확인 할 수 있으며,이 매개 변수는 선언 년대 클래스와 같은 유형입니다.

당신은 얻어서 유형을 비교할 수 있습니다 생성자의 매개 변수의 TypeUsageIUserTypeUsage로 다운 캐스트하려고합니다. ScalarTypeName.Reference.Resolve()을 사용하여 IDeclaredElement의 인스턴스를 가져올 수 있습니다. 이를 클래스의 IClassDeclaration.DeclaredElement과 비교하여 동일한 인스턴스인지 확인하십시오.

1

은, 무슨 얘기하는 것은 실제로는 기본적으로 하나를 얻을하는 복사 생성자입니다!

C#에는 개념이 없습니다 (물론 사용자 정의 할 수 있음). 그러나 간단하게 ICloneable (MSDN)을 구현하는 것이 더 쉽고 (선호되는) 동일한 작업을 수행하는 Clone 메서드를 구현해야합니다.

대신에 :

object myObj = new CloneableObject(otherObj); 

당신은 쓰기 :

object myObj = otherObj.Clone(); 

다른 것은 당신 할 수는 기본 필요가 없으므로 생성자 서명을 강제로 수 있습니다 :

public class BaseClass 
{ 
    //No abstract constructors! 
    public BaseClass(BaseClass copy) 
    { 
    } 
} 

을 이제 파생 될 때, 당신은 constru에서 그 과부하를 사용해야합니다. ctor. 아무것도 파생 서명을 강요하지 않습니다,하지만 적어도 당신은 명시 적으로 사용해야합니다 :

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() : base(this) 
    { 
    } 
} 

위의 예는 명확하게 당신이 복사 생성자를 가지고 "강제로"하지 않음을 보여 주지만, 끈적 끈적한 같은 메모는 좋은 알림으로 작용할 것입니다.

거기에있는 인터페이스 경로를 따라 가야합니다. (추상 구현을 사용할 수 있습니다!).

얕은 복사본을 무료로 받으려면 Object.MemberwiseClone을 활용할 수 있습니다. 모든 객체가이 인터페이스를 필요로하지 않습니다.

+2

복제 방법은 훌륭하지만 실제로 Microsoft는 ICloneable 구현을 권장하지 않습니다. 이는 주로 클론이 깊거나 얕은 경우 인터페이스가 아무 곳도 표시하지 않기 때문입니다. –

+0

@AdiLester 사실, Clone은 원하는대로 할 수 있습니다. 당신이 의미론을 따라 간다면, 기본적으로 복사 작업을위한 인터페이스입니다. – BradleyDotNET

+2

... 여기에 [MSDN] (http://msdn.microsoft.com/en-us/library/system.icloneable%28v=vs.110%29.aspx)의 인용구 : "Clone의 호출자는 예측 가능한 복제 작업을 수행하는 방법에 따라 ICloneable을 공용 API에 구현하지 않는 것이 좋습니다. " –

관련 문제