2012-04-18 39 views
7

Ben sınıflar Kalıtsal Web API API Kontrolörü

Square : Rectangle : Shape (abstract) 

bir çift var ve ben kullanmak istiyorum ApiController devralmasını bir Baz Denetleyicisi var.

public abstract class BaseController<T> : ApiController where T : class 
{ 
    public abstract IEnumerable<T> Get() 
    ... 
} 

ve

public class DerivedController : BaseController<Rectangle> 
{ 
    public override IEnumerable<Rectangle> Get() 
    ... 
} 

public class AnotherDerivedController : BaseController<Square> 
{ 
    public new IEnumerable<Square> Get() 
    ... 
} 

/API/dikdörtgen düzgün arayacak IEnumerable<Rectangle> Get()

/API/meydan bana bir hata verecektir: Ben public new IEnumerable<Square> Get()public override IEnumerable<Square> Get() geçerseniz

Multiple actions were found that match the request: 
System.Linq.IEnumerable`1[Square] Get() on type Web.Api.Controllers.AnotherDerivedController 
System.Linq.IEnumerable`1[Rectangle] Get() on type Web.Api.Controllers.DerivedController 

Döndüğünden beri derleme zamanı hatası alıyorum n imzalar farklı

Doğru yöntemi çağırmak için kodumu nasıl alabilirim? Her sınıfın yöntemlerini RegisterRoutes'ta açıkça kaydettirmek gerekli midir?

cevap

1

Sen temelde new ile bunu kullanıyor, Get geçersiz kılmak gerekir. Bu, sınıfın iki Get yöntemine sahip olacağından ve Web API'sının hangisinin seçilmesiyle karıştırılacağından işe yaramayacaktır.

Sen BaseControllerabstract olarak ve Get olarak virtual veya abstract ve ardından DerivedController uygulamak tanımlayabilir.

+0

Merhaba Aliostad, Sorunuzu değişikliklerinizi yansıtacak şekilde güncelledim. Hala burada bazı problemler alıyorum, ama önerilerin bana yardımcı oldu. Teşekkürler. – khaihon

0

Şu anda kare sınıfınızı alabilen iki denetleyiciniz var. Rotalarınızı nasıl kaydediyorsunuz? Controlers'ı rectangleController ve SquareController olarak yeniden adlandırırsanız, muhtemelen iyi olacaktır.

+1

Şu anda, yalnızca varsayılan yol olan \t \t \t 'yolları.MapHttpRoute (ad:" DefaultApi ", routeTemplate:" api/{controller}/{id} ", default: new {id = RouteParameter.Optional}); 'Benim gerçek kodumda (RectangleController) ve (SquareController) var ... ama yine de aynı hata mesajını vererek doğru şekilde yönlendirmiyor. – khaihon