2017-02-16 3 views
2

Rebar 클래스가 Reinforcement 클래스에서 파생되고 RebarShape 클래스가 ReinforcementShape 클래스를 상속하는 경우 C# 코드에서. 기본 클래스의 ReinforcementShape 속성을 RebarShape 클래스로 재정의 할 수 있습니까?파생 클래스가있는 기본 클래스의 재정의 속성

public class ReinforcementShape 
    { 
    } 

    public class RebarShape : ReinforcementShape 
    { 
    } 

    public class Reinforcement 
    { 
     public ReinforcementShape Shape { get; set; } 
    } 


    public class Rebar : Reinforement 
    { 
     // I want to override the Shape property 
     // but with its derived class which is RebarShape 

     // override the base property somehow! 
     public RebarShape Shape { get; set; } 
    } 

업데이트 :

현재 구현 어떤 문제가 있습니까? 기본에서

:

public virtual ReinforcementShape Shape { get; set; } 

파생에서 :

public new RebarShape Shape { get; set; } 
+1

속성을 무시하고 반환 유형을 변경할 수 없습니다. –

답변

4

당신은 제네릭이 할 수있는,베이스 클래스 멤버 오버라이드 (override) 할 필요가 없습니다 : 쉽게 ReBar의 인스턴스를 생성하고 액세스 할 수 있습니다 지금

public class Reinforcement<T> where T: ReinforcementShape 
{ 
    public <T> Shape { get; set; } 
} 

public class Rebar : Reinforement<RebarShape> 
{ 
} 

그것의 인스턴스이며, Shape -property RebarShape의 :

var r = new Rebar(); 
r.Shape = new RebarShape(); 

이 시도 COMPI의 원인이됩니다 해당 속성에 ReinforcementShape의 인스턴스를 할당 le-time 오류가 발생하면 RebarShape 만 유효합니다.

수정 : 귀하의 편집 당. 반환 값이 아닌 구현을 재정 의하여 멤버를 재정의 할 수 있습니다. 따라서 virtual을 사용하면 귀하의 경우 아무 것도하지 않습니다. 그러나 R.Rusev가 이미 언급했듯이 파생 된 멤버에는 new 키워드 만 필요합니다. 실제로 기본 클래스의 이름과 동일한 이름을 가진 완전히 새로운 멤버가 제공됩니다. 그러나 사실 그것은 완전히 다른 구성원이며 이전 구성원과 공통점이 없습니다. 그러나 다음을 쓸 때

Reinforcement r = new Rebar(); 
// assign value to Shape 
var shape = r.Shape; 

원래 구현은 사용 된 것이지 새로 작성된 것이 아닙니다. 따라서 shapeRebarShape 대신 ReinforcementShape이됩니다. 이 주변에있는 유일한 방법은 처음에 Rebarr을 선언하는 것입니다 :

Rebar r = new Rebar(); 
// assign value to Shape 
var shape = r.Shape; 

을하지만이 또한 어쩌면 자신에게 응용 프로그램의 모든 사용자에게 매우 혼란합니다. generelly 그 키워드를 사용하지 않는 것이 좋습니다. 첫 번째 방법을 사용하는 것이 더 좋습니다.

+0

내 업데이트를 참조 할 수 있습니까? – Vahid

+0

불행히도 제네릭을 사용할 수 없습니다. 왜냐하면이 클래스의 여러 속성에 대해이 작업을 수행해야하기 때문입니다. – Vahid

+0

@Vahid : 질문에 다른 속성을 추가해야합니다. 일반적으로 제네릭을 사용하는 것이 더 좋습니다 ('새 키워드'답변과 비교) – phifi

1

당신은 그것을 수행 할 new 키워드를 사용할 수 있습니다. 따라서 Rebar 클래스에 대한 정의는 다음과 같습니다.

public class Rebar : Reinforement 
{ 
    public new RebarShape Shape 
    { 
     get { return (RebarShape)base.Shape; } 
     set { base.Shape = value; } 
    } 
} 
+5

'new' 키워드는 기본 클래스의 구현을 덮어 쓰지 않지만 * 숨 깁니다. 어쨌든 기본 클래스의 변수로 파생 클래스의 인스턴스를 사용할 때 키워드를 사용하더라도 새 멤버가 아닌 원래 멤버가 사용됩니다. – HimBromBeere

+0

감사합니다. 기본 클래스의 구현을 보여 주시겠습니까? 기본 클래스에서도 설정할 수 있기를 원합니다. – Vahid

+0

@Vahid 기본 클래스는 동일하게 유지됩니다. –

관련 문제