2010-05-05 7 views
1

나는 자바 개발자이며 Java와는 달리 C#에서 추상 클래스를 확장하는 데있어 몇 가지 차이점을 발견했다. 나는 C# 개발자가 어떻게 다음과 같은 결론을 얻었 을까하고 궁금해했다.C에서 추상 클래스 확장하기 #

1)

public abstract class A { 
    public abstract List<B> List(); 
} 
public class BList : List<B> { 
} 
public abstract class C : A { 
    public abstract BList List(); 
} 

Covarience

그래서 위의 계층 구조에서, 그것은 무엇을 반환과 호환되는 형식을 반환하는 C에서 covarience있다. 그러나 이것은 Visual Studio에서 오류가 발생합니다. C#에서 공백 반환 형식을 지정하는 방법이 있습니까? 속성

public abstract class A { 
    public abstract String Name { get; } 
} 
public abstract class B : A { 
    public abstract String Name { get; set } 
} 

에 세터를 추가

2) 여기서 컴파일러는 숨어 불평. 어떤 제안?

유일한 방법이 아니면 인터페이스를 사용하지 않는 것이 좋습니다.

+4

C#은 가상 메서드를 재정의 할 때 반환 유형 공분산을 지원하지 않습니다. 죄송합니다! –

답변

0

어쨌든 나는 당신의 의도를 이해하지 못합니다. 이런 식으로 해결하지 그래? 두 번째 질문에 대해

public class BList : List<T> where T : B {} same = public class BList : List<B> {} 

public class C : A 
{ 
    public override List<B> Liste() 
    { 
     return new BList(); 
    } 
} 

:

당신이 내 눈에 나쁜 디자인이하고 싶어. 두 키워드 모두에서 키워드 virtual을 사용하고 경고를 무시할 수는 있지만 왜 이런 식으로하고 싶습니까?

public abstract class A 
{ 
    public virtual string Name { get; protected set; } 

} 

public abstract class B : A 
{ 
    public virtual string Name { get; set;} 
} 
+0

첫 번째 질문에 대한 귀하의 대답은 공분할 수 없습니다. 두 번째로 이것은 불만족 스럽습니다. 두 개의 독립적 인 유형이 필요합니다. A와 B가 종속성을 갖지 않기를 바랍니다. B가 추가 setter 메소드를 원한다는 것은 중요하지 않습니다. –

0

이들 중 어느 것도 C#에서 지원되지 않습니다. 공변 수익률은 기본 런타임 (CLR)에서도 지원되지 않습니다.

CLR에서는 속성 예제의 줄을 따라 수행 할 수 있지만 C#에서는 수행 할 수없는 것으로 보입니다. 후드에서 속성은 이름, 속성 유형 및 일반적으로 get_<Property>set_<Property>으로 명명 된 getter 및 setter 메서드에 대한 참조로 구성됩니다 (그러나 CLS가 아닌 경우 해당 규칙을 따를 필요는 없음). - 준수 클래스). getter 만있는 기본 클래스에서 속성을 만들 수 있으며 동일한 이름과 getter를 가진 파생 클래스의 다른 속성이지만 자체 setter가있는 속성을 만들 수 있습니다. 그러나, 나는 어떤 .NET 언어도 그런 정의를 허용한다는 것을 모른다.

+0

속성 설정 기가 추가되지 않았는데, 속성이 구문법 설탕 추가 set_ get_ 메서드에 대한 것이라고 생각 했습니까? –

+0

@ng : CLR 레벨에서 효과적이지만, 고급 언어에서 특별한 대우를받습니다. 이것은 이것이 당신을 제약하는 한 가지 경우입니다. –