내 시나리오는 수학 문제를 개발하는 것에 관한 것입니다. IProblem
인터페이스로 포함해야하는 두 가지 주요 특성은 QuestionText
및 Response
입니다. QuestionText
는 항상 문자열 수 있지만 Response
때로는 복잡한 객체 (사용자 정의 Fraction
struc) 또는 문자열, 진수, INT와 같은 다른 데이터 유형 등기본 클래스에 속성을 캡슐화하는 방법은 무엇입니까?
public interface IProblem
{
string QuestionText { get; set; }
object Response { get; }
bool IsComplete();
bool IsCorrect();
}
당신이 볼 수 있듯이, Response
객체가 될 수 있습니다. 사실상 모든 문제에는 응답이 있기 때문에이 데이터 유형을 추측했습니다. 그리고 그것이 대상이기 때문에, 나는 미래의 오류 (캐스팅 문제)에 대해서만 얻을 것을 정의합니다.
나중에 캐스팅 할 필요없이이 속성 (Response
)에 액세스하는 구체적인 클래스에서 아이디어가 나옵니다. 확인 해봐?
public abstract class Problem : IProblem
{
public string QuestionText { get; set;}
public object Response { get; protected set; }
public virtual bool IsComplete()
{
return true;
}
public abstract bool IsCorrect();
}
public class BinaryProblem : Problem
{
public decimal N1 { get; set; }
public decimal N2 { get; set; }
public decimal Response
{
get { return (decimal)base.Response; }
set { base.Response = value; }
}
public override bool IsCorrect()
{
return N1 + N2 == Response;
}
}
여기 값을 테스트하고 있습니다.
static void Main(string[] args)
{
BinaryProblem p = new BinaryProblem();
p.N1 = 2;
p.N2 = 4;
p.Response = 6;
IProblem p2 = p;
Console.WriteLine(p2.Response);
Console.WriteLine(p2.IsComplete().ToString());
}
지금까지는 작동하지만, 내가하고있는 일이 올바른지 아니면 좋은 습관인지 알고 싶습니다. 나는 이것을하기 위해 다른 사람들이 new
연산자를 사용하는 것을 보았다. 다른 사람들은 base
이라는 단어를 사용하지 않습니다.
좋은 방법입니까? 미래의 오류를 일으킬 수 있습니까? 제 디자인에 대한 피드백을주세요.
편집 : 비 제네릭 인터페이스에서 응답에 액세스해야합니다.
개인적으로 개체에 대해 일반 또는 IResponse 인터페이스를 사용합니다. 객체를 사용하면 ResponseB는 말 그대로 StringBuilder, Int32 또는 심지어 WebRequest를 포함하는 모든 것일 수 있습니다. 인터페이스 나 Generics를 사용하면 응답을 구현하는 방법을 훨씬 더 세밀하게 제어 할 수 있습니다. – ctorx
예, 및; 'Reponse'는 항상 숫자 값입니까?그런 다음 가장 적합한 수식 유형, 즉 'double'또는 'decimal'중에서 적절한 것을 사용하십시오. –
@ctorx와 동의하면 Generics는 문제를 훨씬 더 명확하게 해결할 수 있습니다.이 경우 클래스 메소드/속성을 숨기고 싶지만 각 유형의 결과에 대해 diff 이름을 갖고 유형에 대해 원하는 결과 만 표시해야합니다. interface –