2012-09-24 7 views
3

그래서 기본적으로 인스턴스를 가져 와서 목록에 추가하는 개체가 있습니다. 각 인스턴스는 가상 메소드를 사용하며, 일단 인스턴스가 작성되면이를 대체해야합니다. 인스턴스의 메서드를 재정의하려면 어떻게해야합니까?C# 인스턴스 메서드를 재정의

+3

당신은 _instance_의 메소드를 오버라이드 (override)하지 않는, 당신이 _class_의 메소드를 오버라이드 (override),

편집, 그냥 갈 첫 번째 대답을 보았다. 메서드를 재정의해야하는 경우 재정의 된 메서드로 자식 클래스를 정의하고 해당 자식 클래스의 인스턴스를 만듭니다. –

+1

아마도 오버라이드가 OP의 단어 중에서 가장 좋은 단어는 아니지만 그들이하고 싶은 것은 유효한 아이디어입니다. 기본적으로 런타임시 기능을 변경할 수 있기를 원합니다. @JustinNiessner가 말했듯이이 기능을 사용하면 매우 유용합니다. 대의원. –

답변

14

수 없습니다. 클래스를 정의 할 때만 메소드를 재정의 할 수 있습니다. 개체가이 동작을 변경할 수 없습니다 생성되면

public class SomeClass 
{ 
    public Func<string> Method { get; set; } 

    public void PrintSomething() 
    { 
     if(Method != null) Console.WriteLine(Method()); 
    } 
} 

// Elsewhere in your application 

var instance = new SomeClass(); 
instance.Method =() => "Hello World!"; 
instance.PrintSomething(); // Prints "Hello World!" 
0

C 번호가 정적 인 :

최선의 선택은 자리 표시 자로 적절한 Func 대리자를 사용하여 호출자가 구현 그런 식으로 제공 할 수 있도록 대신입니다 그 물체. inhertance를 사용하여 수퍼 클래스를 하위 클래스로 만들 수 있지만 이는 런타임이 아닌 designtime에서 수행됩니다.

class foo 
{ 
    public virtual void dosomething() 
    { 
     console.writeline("this is foo"); 
    } 
} 

class bar : foo 
{ 
    public override void dosomething() 
    { 
     console.writeline("this is bar"); 
    } 
} 

var list = new Foo[]{new foo(), new bar()}; 

또한 AOP - aspect 지향 프로그래밍의 개념이 있습니다. 여기서 런타임에 동작을 주입 할 수 있습니다. 내가 그 알고 있어요 2 개 프레임 워크가이

  1. 성 동적 프록시
  2. Spring.Net 실행시 수는 없습니다
+0

나는 이것을 고려했다. 그러나 얼마나 많은 객체 유형이 정의 될지 모르겠다. – tsturzl

0

을한다. 클래스의 동작이 인스턴스화되면 변경할 수 없습니다. 그러나 당신은 대리자 메서드를 만들 수 있습니다.)

관련 문제