기존 코드 기반을 정리하려고하는데 추상 클래스의 여러 파생 클래스에 대한 일반 참조 이름을 사용하는 데 문제가 있습니다. 예를 들어추상 기본 클래스를 사용하여 C# 런타임 다형성
:
public abstract class Base<T> : Utilities.CommonRequiredObject
{
protected List<T> RawContents = new List<T>();
.
.
public abstract void LoadContents(List<T> Contents); // Each Class needs to load and process differently
protected List<T> Contents;
public virtual void DoSomething() // Default here for common use. Defined in Each class for its specifics (if needed)
{
...
}
public abstract List<T> FunctionToGetContents();
}
public class FOO : Base<string>
{
public override void DoSomething() ...
public override List<string> FunctionToGetContents() ...
}
public class BAR : Base<byte>
{
public override void DoSomething() ...
public override List<byte> FunctionToGetContents() ...
}
홈페이지 로직은 공통 변수를 사용하려고합니다. 사용할 새 클래스를 만들고 싶지만 런타임 다형성 방식으로 사용하고 싶습니다. 다음 코드
IE: Base<T> ObjectToUse;
이 방법은, 내가 단순히 ObjectToUse
를 참조 할 수 있습니다 : 클래스는 일반적인 기능을 가지고 있고, 필요한 재정을 가지고, 나는 인스턴스를 생성하고 사용할 수 있도록하려면 일반적인 방법을 호출하십시오. 다른 기본 클래스에서 몇 가지 공통 루틴을 상속 받았기 때문에 인터페이스를 사용할 수 있는지 없는지 확실하지 않습니다.
if(variable)
{
FOO ObjectToUse = new FOO();
}
else
{
BAR ObjectToUse = new BAR();
}
ObjectToUse.LoadContents(ObjectToUse.FunctionToGetContents());
ObjectToUse.DoSomething();
...
편집 : 내가 빨리 접수 된 의견을 바탕으로이 (덕분에 다시 모두)가) 일반 (Base<T>
)를 제거하는 것보다 더 나은 입력 자료 (모든 수업을 것입니다, 나는이를 정의 할 수 있습니다 ObjectToUse
단순히 Base ObjectToUse;
으로 생각합니다.
이 작동하지 않을. 당신의 클래스'Base'와'Base '는 공통 조상을 가지고 있지 않습니다. –
Sjips
인터페이스를 사용하지 않는 이유는 무엇입니까? 'FOO'와'BAR' 둘 다'DoSomething()'메소드 서명을 선언 한'IDoSomething'을 구현했다면, 당신은 사업을 할 수 있습니다. – 48klocs
@Sjips 사실 그들은 (CommonRequiredObject)하지만 그에게 쓸모가있는 것은 아닙니다. – BradleyDotNET