제네릭 클래스를 사용할 때 내 목표를 달성하는 방법을 알고 있습니다. 그러나 제네릭 메서드의 구문이 비 제네릭 클래스에서 (가상 또는 추상으로 선언 될 수 있도록) 허용되는 이유를 이해하려면 결정할 수 없습니다.제네릭 클래스가 아닌 일반 메서드 재정의
코드의 첫 번째 청크는 제네릭 클래스를 사용하여 기본 클래스에서 제한된 인터페이스보다 더 구체적인 인터페이스를 반환하는 추상 메서드를 만드는 간단한 예제를 보여줍니다. 차트 클래스에서 제네릭 형식을 제거하지만, iSeries의 제약으로 일반적인 방법을 유지하는 경우
public interface ISeries
{
string Name { get; set; }
string Color { get; set; }
}
public interface ITimeSeries<TY> : ISeries
{
double[] XValues { get; set; }
TY[] YValues { get; set; }
}
public interface IPhasorSeries : ISeries
{
double Magnitude { get; }
double Angle { get; }
}
public class PhasorSeries : IPhasorSeries
{
public string Name { get; set; }
public string Color { get; set; }
public double Magnitude { get; set; }
public double Angle { get; set; }
}
public class Series<T> : ITimeSeries<T>
{
public string Name { get; set; }
public string Color { get; set; }
public double[] XValues { get; set; }
public T[] YValues { get; set; }
}
public abstract class Chart<T> where T : ISeries
{
public abstract T GetSeries();
}
public class AnalogChart : Chart<ISeries>
{
public override ISeries GetSeries()
{
return new Series<float>();
}
}
public class PhasorChart : Chart<IPhasorSeries>
{
public override IPhasorSeries GetSeries()
{
return new PhasorSeries();
}
}
지금, 나는 다음의 오류를 얻을.
public abstract class Chart
{
public abstract T GetSeries<T>() where T : ISeries;
}
public class AnalogChart : Chart
{
public override T GetSeries<T>()
{
// ERROR:
// Cannot implicitly convert type Test.Series<float> to 'T'
// Cannot convert expression type Test.Series<float> to return type 'T'
return new Series<float>();
}
}
public class PhasorChart : Chart
{
public override T GetSeries<T>()
{
// ERROR:
// Cannot implicitly convert type Test.PhasorSeries to 'T'
// Cannot convert expression type Test.PhasorSeries to return type 'T'
return new PhasorSeries();
}
}
는 내가 완전히 비 제네릭 클래스의 일반적인 방법을 구현할 때에 무슨 일이 일어나고 있는지 이해가 안 나타납니다. 제네릭 클래스가 사용되면 - 여러 클래스 정의가 존재합니다. 일반적인 방법 만 사용하면 무엇을 의미합니까? 실제로 여러 가지 방법이 있습니까? 아니면 어떻게 든 그냥 같은 메서드를 호출합니까?
본질적으로 추상적 키워드 및 가상 키워드로 지원되지 않는 경우 추상적 인 제네릭 메소드를 생성 할 때 오류가 발생할 것으로 예상됩니다. 여기에서 구문을 사용하여 다른 코드에서 변환하지 못하게하는 경우 추상 일반 메소드를 올바르게 사용하는 방법은 무엇입니까? (저는 T를 ISeries에 캐스트 할 수 없습니다 - T가 ISeries 여야한다는 것을 모르는 것처럼 하위 클래스에서 제약 조건이 손실 된 것처럼 보입니다)
여기에서 질문의 목적은 이 문제를 해결하지 않거나 다른 '해결 방법'을 제안하지 않을 것입니다.
@juharr : 그건 작동하지 않습니다. 제약 조건은 기본 메서드에서 상속됩니다. – JuanR