유형 T의 개체에 대한 값을 업데이트하려면 어떤 디자인 패턴을 사용해야합니까?

세바스찬 패튼

다음 시나리오가 있으며 for 루프에 배치 할 디자인 패턴을 파악하려고합니다.

쿼리는 항상 바나나 또는 사과 만 반환합니다. 바나나와 사과를 절대 혼합하지 마십시오. DoStuff를 호출 할 때 쿼리를 제어 할 수 있기 때문에 Bananas 또는 Apples가 반환 될 것인지 미리 알고 있습니다.

나는 바나나의 길이 또는 사과의 직경을 설정하는 DoStuff에 대한 두 번째 매개 변수로 인터페이스를 통과하는 접근 방식을 시도해 왔습니다.

어떻게 이것을 달성 할 수 있는지에 대한 제안이 있습니까? 재사용이 가능하려면 DoStuff가 필요합니다.

    public class BaseClass
    {

    }

    public class Apple : BaseClass
    {
        public int Diameter { get; set; }
    }

    public class Banana : BaseClass
    {
        public int Length { get; set; }
    }

    public void DoStuff(Query query)
    {
        // The query only ever returns bananas OR Apples. Never both.
        var items = repository.GetItems<BaseClass>(query);

        foreach (var item in items)
        {
            // Code to run some arbitrary calculation then set Length if Banana
            // Code to run some arbitrary calculation then set Diameter if Apple
        }
    }
피터 리치

파생 클래스가 동작이나 데이터를 공유하지 않는데 왜 기본 클래스가 있습니까? Liskov Substitution 원리 (LSP)를 살펴 봐야합니다. LSP는 기본적으로 올바른 시스템이 강력한 행동 하위 유형을 준수하며 한 유형이 다른 유형으로 대체 될 때 다형성 시나리오에서 정확성 등을 위반하지 않을 것이라고 말합니다.

당신은 공통점이 전혀없는 두 개의 서브 클래스를 가짐으로써이 원칙을 분명히 위반하고 있습니다. 나는 당신이 이것에 접근하는 다른 방법을 살펴보고 누군가가 당신이 필요로하는 것을 성취하도록 도울 수 있도록 당신이 성취하고자하는 것에 대해 더 자세히 설명 할 것을 제안합니다.

수행하려는 작업에 대해 더 많이 알지 못하는 경우 다음과 같이 제안 할 수 있습니다.

public abstract class BaseClass
{
    public abstract void DoSomething();
}

public class Apple : BaseClass
{
    public int Diameter { get; set; }
    public override void DoSomething()
    {
        // Do something specific for Apple
    }
}
//...
public void DoStuff(Query query)
{
    // The query only ever returns bananas OR Apples. Never both.
    var items = repository.GetItems<BaseClass>(query);

    foreach (var item in items)
    {
        item.DoSomething();
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

개체 인터페이스에 대한 키 경로 배열의 공용체 유형을 인터페이스에서 해당 키 경로의 공용체 유형으로 사용하려면 어떻게 해야 합니까?

오류를보고하려면 사용자 정의 JSP 태그에 어떤 디자인 패턴을 사용해야합니까?

체인에서 통신하는 세 가지 데이터 소스를 결합하려면 어떤 디자인 패턴을 사용해야 합니까?

독일어 문자의 가변 길이에 어떤 데이터 유형을 사용해야합니까?

유사하게 if-else가 커질 때 어떤 디자인 패턴을 사용해야합니까?

질문이 많은 설문지에는 어떤 유형의 데이터베이스 디자인을 사용해야합니까?

내 응용 프로그램에 대한 정보를 저장하려면 어떤 유형의 파일을 사용해야 합니까?

이러한 유형의 Google 스프레드 시트 검색에 어떤 기능을 사용해야합니까?

타임 라인에 어떤 유형의 목록을 사용해야합니까?

모델의 Django 작은 바이트 문자열, 모델링에 어떤 유형을 사용해야합니까?

레코드의 값을 인터페이스 유형이 동일한 객체 키로 사용하려면 어떻게해야합니까?

2 자리 HEXADECIMAL 값을 포함 할 배열에 어떤 C 데이터 유형을 사용해야합니까?

정규식 및 문자열 / 파일 작업을 결합한 Python을 사용하여 텍스트 파일 내에서 패턴을 검색하고 패턴의 인스턴스를 저장하려면 어떻게해야합니까?

오디오 플러그인을 스캔하려면 QT에서 어떤 유형의 스레드 모델을 사용해야합니까?

구조체에 대한 포인터를 첫 번째 멤버로 캐스트하려면 어떤 유형의 C ++ 캐스트를 사용해야합니까?

C # 클래스에 이미지 및 색상 속성이있을 때 어떤 종류의 디자인 패턴을 사용해야합니까?

이 경우 어떤 디자인 패턴을 사용해야합니까?

unlabeled_t를 사용하지 않으려면 / etc / zabbix /에 대한 사용자 정의 파일 컨텍스트 유형을 만들어야합니까?

React Native 이 호출 API에 어떤 디자인 패턴을 사용하고 다른 구성 요소를 업데이트해야 합니까?

특정 패키지에 대한 업데이트를 사용자에게 경고하도록 Pacman을 구성하려면 어떻게해야합니까?

사용자 입력이 유효한지 확인하고 입력 유형에 대한 경고 기반을 설정하려면 어떻게해야합니까?

테이블 행을 보유하려면 어떤 유형의 데이터 구조를 사용해야합니까?

내 소품에서 일치 개체를 참조하려면 어떤 TypeScript 유형을 사용해야합니까?

virt-manager에서 운영 체제 유형에 대해 사용 가능한 버전을 업데이트하려면 어떻게합니까

정규식을 사용하여 URL에 특정 패턴이 포함되어 있는지 확인하고 URL의 일부를 자바스크립트에서 다른 패턴으로 대체하려면 어떻게 해야 합니까?

비슷한 클래스 사용을 일반화하려면 어떤 디자인 패턴을 사용해야합니까?

유형 매개 변수에 의존하는 기본 인수에는 어떤 유형을 사용해야합니까?

인터페이스에서 버퍼 크기를 정의하려면 어떤 유형을 사용해야합니까?

이 형식에서 원하지 않는 문자를 구문 분석하려면 어떤 정규식 패턴을 사용해야합니까?

TOP 리스트

  1. 1

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  2. 2

    std :: regex의 일관성없는 동작

  3. 3

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  4. 4

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  5. 5

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  6. 6

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  7. 7

    Ionic 2 로더가 적시에 표시되지 않음

  8. 8

    Seaborn에서 축 제목 숨기기

  9. 9

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  10. 10

    복사 / 붙여 넣기 비활성화

  11. 11

    ArrayBufferLike의 typescript 정의의 깊은 의미

  12. 12

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  13. 13

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  14. 14

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  15. 15

    PRNG 기간보다 순열이 더 많은 목록을 무작위로 섞는 방법은 무엇입니까?

  16. 16

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  17. 17

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  18. 18

    잘못된 구성 개체입니다. Webpack이 Angular의 API 스키마와 일치하지 않는 구성 개체를 사용하여 초기화되었습니다.

  19. 19

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  20. 20

    R의 마침표와 숫자 사이에 문자열 삽입

  21. 21

    Assets의 BitmapFactory.decodeStream이 Android 7에서 null을 반환합니다.

뜨겁다태그

보관