2009-03-05 2 views
4

가상 메서드가 많은 C# 클래스가 있는데,이 메서드 중 일부는 본질적으로 추상적입니다 (하위 클래스에서는 완전히 구현되고 기본 클래스는 비어 있음).가상 클래스의 추상 메서드

컴파일하려면 기본 클래스에 InvalidOperationException을 던지며 수행 할 작업에 대한 설명을 추가합니다. 이것은 단지 더러운 느낌.

내 수업을 설계하는 더 좋은 방법이 있습니까?

편집 : 캐나다에서 실행되는 응용 프로그램의 중간 계층을위한 것으로, 따라서 절반의 메소드가 일반이므로 가상입니다. 방법의 절반은 특정 지방에 해당합니다.

Public class PersonComponent() 
{ 

public GetPersonById(Guid id) { 
    //Code to get person - same for all provinces 
} 

Public virtual DeletePerson(Guid id) { 
    //Common code 
} 

Public virtual UpdatePerson(Person p) { 
    throw new InvalidOperation("I wanna be abstract"); 
} 

Public Class ABPersonComponent : PersonComponent 
{ 
    public override DeletePerson(Guid id) 
    { 
     //alberta specific delete code 
    } 

    public override UpdatePerson(Person p) 
    { 
     //alberta specific update codecode 
    } 

} 

희망이 의미를

답변

1

개체 계층을 생각해보십시오. 파생 된 모든 클래스에 공통 코드를 공유하고 기본 클래스에 기본 기능을 구현하고 싶습니까?

공유 기본 코드가있는 경우 템플릿 패턴을 확인하십시오. 공용 메소드를 사용하여 코어/공유 구현을 사용하여 보호 된 가상 메소드에 연결할 수 있습니다. 공유 구현 methodname을 "Core"로 끝내십시오. 예를 들어

: 난 추상 기본 클래스로 갈

public abstract class BaseClass 
{ 
    protected virtual void DeletePersonCore(Guid id) 
    { 
     //shared code 
    } 

    public void DeletePerson(Guid id) 
    { 
     //chain it to the core 
     DeletePersonCore(id); 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    protected override void DeletePersonCore(Guid id) 
    { 
     //do some polymorphistic stuff 

     base.DeletePersonCore(id); 
    } 
} 

public class UsageClass 
{ 
    public void Delete() 
    { 
     DerivedClass dc = new DerivedClass(); 

     dc.DeletePerson(Guid.NewGuid()); 
    } 
} 
+0

정확히 내가 무엇을했는지 Ta입니다. – aaron

15

마크으로 추상 기본 클래스뿐만 아니라 더 구현이없는 방법을합니다.

그래서

public abstract class BaseClass 
{ 

    public abstract void AbstractMethod(); 
} 

public class SubClass: BaseClass 
{ 
    public override void AbstractMethod() 
    { 
     //Do Something 
    } 
} 

처럼 당신은 추상 클래스의 외부에서 추상 메서드를 가질 수 없습니다. 클래스를 추상으로 표시하면 인스턴스를 생성 할 수 없습니다. 그러나 그때 그것은 이해가되지 않습니다. 어쨌든 메소드를 구현하지 않는 클래스로 무엇을 할 것입니까?

편집 : 클래스를 보면 예를 들어 PersonPerson 추상을 UpdatePerson 메서드와 함께 만들 것입니다. 그 중 하나 또는 UpdatePerson이 PersonComponent에 대해 아무 것도하지 않으면 그대로 유지하고 UpdateComponent 메서드를 PersonComponent에 대해 비워 두십시오.

+0

. 모든 공통 코드는 기본 클래스의 protected (추상이 아닌) 메소드에서 호출 할 수 있습니다. 업데이트 preson 메서드에서 예외가 throw 된 이유는 실제 코드에 무언가를 반환하기 때문이며 빌드 (함수는 아무것도 반환하지 않습니다. 오류) – aaron