2013-07-31 4 views

답변

5

수 없습니다. 정적 메서드는 자식 클래스에서 재정의 될 수 없으며 실제로 컴파일시 정확히 동일한 CIL을 생성한다는 점에서 Student.GenerateRandomInstancePerson.GenerateRandomInstance —을 구별 할 수있는 방법이 없습니다.

는 대신 일반적인 방법을 사용할 수 있습니다

public static T GenerateRandomInstance<T>() where T : Person, new 
{ 
    var p = new T(); 
    // randomize properties 
    return p; 
} 

Person.GenerateRandomInstance<Student>(); 

을하지만, 유형이 매개 변수가없는 생성자가있는 경우에만 작동합니다. 인수를 생성자에 전달하려면 다소 어려워집니다. 당신은 항상 당신이 당신이 할 수있는 생성자에 전달하려는 어떤 값을 알고 가정 : 물론

public static T GenerateRandomInstance<T>() where T : Person 
{ 
    var p = (T)Activator.CreateInstance(typeof(T), "hello", 4); 
    // randomize properties 
    return p; 
} 

, 지정된 유형이 적합한 생성자를 포함하지 않는 경우이 역시 실패합니다.

+0

+1 고마워요! person 생성자는 2 개의 인수를 취합니다 ...이 좋은 대답을 게시 할 곳을 알지 못했다는 언급을해야합니다;) –

+0

@TonoNam은 'Person'의 모든 하위 유형에 대해 동일한 매개 변수이거나 그들은 서로 다른 유형입니까? –

+0

나는 1 분 안에 도움이 될만한 덕분에 거기에있게 될 편집 작업을하고 있습니다 ... –

1

학생 클래스에서 GenerateRandomInstance() 메서드를 재정의해야합니다. 현재 Person의 기본 메소드가 호출되고 있습니다.

+1

고정 방법 –

+0

을 재정의 할 수 없습니다. 맞아요. 그것을 놓쳤습니다. 감사합니다 –

2

다음과 같이 시도해보십시오. PersonStudent은 각각 자신의 GenerateRandomInstanceRandomizeProperties 방법을 정의합니다. Student은 기본 클래스가 알고있는 속성을 무작위 화하도록하기 위해 PersonRandomizeProperties을 호출합니다. Student 그러면 Student 클래스에 의해 도입 된 속성 만 무작위 화됩니다.

참고 :이 문제는 종종 Abstract Factory 또는 Builder 디자인 패턴에 의해 해결됩니다. 아래 해결책은 그것들 중 어느 것도 아닙니다.

class Person 
{ 
    public string Name { get; set; } 

    public virtual void Speak() 
    { 
     Console.Write("Hello I am a person"); 
    } 

    public static Person GenerateRandomInstance() 
    { 
     var o = new Person(); 
     RandomizeProperties(o); 
     return o; 
    } 

    protected static void RandomizeProperties(Person o) 
    { 
     // randomize Person properties here 
    } 
} 

class Student : Person 
{ 
    public override void Speak() 
    { 
     Console.Write("Hello I am a student"); 
    } 

    // note the use of the 'new' keyword 
    new public static Student GenerateRandomInstance() 
    { 
     var o = new Student(); 
     RandomizeProperties(o); 
     return o; 
    } 

    protected static void RandomizeProperties(Student o) 
    { 
     Person.RandomizeProperties(o); 

     // randomize Student properties here 
    } 
}