문제

나는 그것이 실제로 "다형성"질문인지 확실하지 않지만 어쨌든 ... 그래서 나는 그것을 상속하는 추상적 인 수업과 2 개의 다른 클래스가 있습니다.

기본 클래스의 일부 코드에는 기본 클래스를 확장하는 클래스마다 다른 변수가 있습니다.

그렇게하는 가장 좋은 방법은 무엇입니까? "get"메소드를 무시 하시겠습니까? 기본 클래스에서 값을 전달하는 확장 클래스로 기능을 호출하려면 아키텍처를 조금 변경하십시오 ...

다음은 예입니다 (컴파일하지 않고 내가 어떻게했는지에 대한 작은 예제) : :

public abstract class BaseAbstract class {

  ... some code ....

  // Here "listName" would change depending on the extending class
  protected List<Items> getAllItems(String listName) {

    Web.getList(listName);

    ... some code ...

  }

  protected abstract List<Items> getAllItems();

}

public class NewClass : BaseAbstract {
 protected override void getAllItems() {
    return getAllItems("ListNameOfNewClass");
 }
}

그것이 내가 한 방식이지만 IMO를 유지하기가 쉽고 쉽게 느끼지 않습니다.

어떤 아이디어 나 의견을 환영합니다!

도움이 되었습니까?

해결책

아마 다음과 같은 것을 선택할 것입니다.

public abstract class Base
{
    protected abstract string ListName { get; }
    public List<Item> GetItems()
    {
        return Web.GetList(ListName);
    }
}

public class Child : Base
{
    protected override string ListName
    {
        get { return "MyListName"; }
    }
}

다른 팁

상속보다 구성을 선호합니다.

public class Base {
  private ItemListGetter itemListGetter; // assignment/initialization is up to you

  private List<Items> getAllItems() {  // this can now be inlined
    return itemListGetter.getList();
  }

}

이것이 서브 클래스 간의 변동의 유일한 차원이라면, 여기에는 더 이상 상속이 필요하지 않습니다. 필요에 따라 올바른 ItemListGetter를 설정하십시오.

나는 아마 다음과 같은 접근법을 위해 갈 것입니다.

public abstract class Base
{
    protected List<Items> getAllItems(String listName) 
    {
        // Implementation
    }

    public abstract List<Items> Items
    {
        get;
    }
}

public class NewClass : Base
{
    public override List<Items> Items
    {
        get
        {
            return base.getAllItems("ListNameOfNewClass");
        }
    }
}

이는 내부 보호 기능 (getAllitems)을 공개적으로 노출 된 방법 / 속성과 분리하며 NewClass에서 물려받은 모든 클래스에서도 사용할 수 있음을 의미합니다.

나는 당신의 인터페이스를 바꾸고 순전히 돼지 머리에서 속성으로 노출되었습니다! 그리고 파티는 당신이 할 수 있다는 것을 몰랐을 경우를 대비하여 ...

정답이 확실하지 않지만 초기화 중에 상속 클래스에서 설정 한 기본 클래스 보호 변수를 가질 수 있습니까?

예 :

class test
{
    protected string listName;

    protected void getAllItems() 
    {
        return getAllItems(listName);
    }
}

class test2 : test
{
    public test2()
    {
        base.listName = "MyUniqueList";
    }
}

세 번째 구성 요소를 구현하는 것이 더 의미가 있다고 생각합니다.

    public abstract class BaseClass {

        protected abstract IList<Item> getAllItems();
    }

    public class SubClass : BaseClass 
    {
        IItemsProvider itemsProvider;

        protected override IList<Item> getAllItems() 
        {
            return itemsProvider.getAllItems("filter");
        }
    }

    public interface IItemsProvider
    {
        IList<Item> getAllItems(string name);
    }

당신이 정말로 상속을하고 싶다면, 나는 선택합니다. Ctacke 's 해결책.

그러나 일반적으로 문제는 상속으로 해결되지 않은 것 같습니다. 상속은 전문적인 행동을 제공하는 데 사용되어야합니다. 그러나 귀하의 경우에는 구성 문제가 더 많아 보입니다. 즉, 서브 클래싱없이 외부에서 구성하는 속성 (예 : List-Name)을 제공해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top