2014-11-19 5 views
0

실제 전화 :호출 방법

public class BaseClass 
{ 
    public string GetName() 
    { 
     // I can request the value of the property like this. 
     return this.GetType().GetProperty("FullName") 
        .GetValue(this, null).ToString(); 
    } 
} 

아이 클래스 :

public partial class ChildClass : BaseClass 
{ 
    public string FullName; 
    public int Marks; 
} 

질문 : 방법

ChildClass classCall=new ChildClass(); 
classCall.FullName="test name"; 
string returnName=classCall.GetName(); 

상위 클래스 어떻게 나는 속성 이름, 즉 GetProperty("FullName")을 하드 코딩하는 것을 피한다. 나는 속성 이름을 하드 코드하지 않고 오히려 다른 접근법을 사용하여 부모 메소드에 사용하고 싶지 않습니까?

+4

아니오; 그건 잘못된거야. 왜이 세상에 반성을 사용하고 있습니까? 왜 다형성을 사용하지 않는가? 또는 "FullName"을 기본 클래스에 넣으시겠습니까? – BradleyDotNET

+0

엔티티 객체 클래스가 여러 개 생성 된 경우 EF 자동으로 테이블에서 해당 속성을 생성합니다. 각 엔티티에 부분 클래스를 만들고 기본 클래스를 작성한 다음 기본 클래스에 공통 메소드를 작성한 다음 여러 자식 클래스에 대해 하나의 메소드를 사용하도록하십시오. – Sharpeye500

+1

@ Sharpeye500 : 그러나 기본 클래스는 테이블에 FullName 속성이있을 때만 작동합니다. 맞습니까? 따라서 논리적으로 기본 클래스에 속합니다. –

답변

6

첫째, 공용 필드 사용을 피하는 것이 좋습니다. 공개 상태로 만들려면 속성을 사용하십시오. 그 시점에서

을 (... 당신은 당신의 반사 호출의 속성에 대한을 요구하고 있지만 파생 클래스는 필드를 선언), 당신은 FullName에게 기본 클래스에 추상적 속성을 확인하고 허용 할 수 있습니다 각 파생 된 클래스는 원하는대로 구현하지만 기본 클래스에서 호출 할 수도 있습니다.

반면에 파생 된 모든 클래스가이를 구현해야한다면 왜 기본 클래스의 생성자에 전달하지 않는 것이 좋을까요? 어떤 클래스가 FullName 없이는 의미가 있습니다. 그렇지 않으면 - 현재 코드가 깨져서 FullName 필드가 아니기 때문에 기본 클래스에서 시작하지 않으시겠습니까? 당신이 BaseClass로 초기화하고 싶지는 않을 경우

-1
public class BaseClass 
    { 
     public virtual string GetName() 
     { 
      return string.Empty; 
     } 
    } 

    public partial class ChildClass : BaseClass 
    { 

     public string FullName; 
     public int Marks; 

     public override string GetName() 
     { 
      return FullName; 
     } 
    } 

그러나, 당신이 그것을 추상하고는 GetName 방법의 자체 버전 구현하는 구현 모두 강제 할 객체 :

public abstract class BaseClass 
    { 
     public abstract string GetName(); 
    } 

BR을

+2

숨기기가 거의 무시되지 않는 것이 좋습니다. 왜 '가상'을 사용하지 않습니까? – BradleyDotNET

+1

누군가가 약간 덜 미친 방법으로 정말 나쁜 디자인을 구현하는 것을 돕는 것은 좋은 생각이 아닙니다. 적절한 언어 기능을 사용하여 동일한 디자인 목표를 달성하는 방법을 제시하는 것이 훨씬 낫습니다. 이 경우'FullName'은 가상 또는 추상 속성이어야하며'GetName()'은 전혀 존재하지 않아야합니다. 위와 같이,'new'는'virtual'보다 거의 바람직하지 않습니다.'GetName()'이 존재할 이유가 있더라도 절대적으로 아닙니다. –

+0

물론 당신 말이 맞습니다. 첫 번째 접근법은 자신의 도메인에 대해 아무 것도 모르기 때문에 최대한 코드를 변경하는 것이 었습니다. 그러나 나는 지금 귀하의 의견을 포함 시켰습니다. : / – Matthias