大家好,
思路如下程式碼:
這是BaseService.cs的內容
public virtual async Task<int> Add(TViewModel viewModel, TEntity entity)
這是sysUserInfoService.cs的內容
public class SysUserInfoServices : BaseServices<UserViewModel ,sysUserInfo>, ISysUserInfoServices
其中UserViewModel為
public class UserViewModel : IUserViewModel
{
public UserViewModel()
{
}
}
而UserCreateDto如下
public class UserCreateDto : IUserViewModel
我設定重寫BaseService.cs的Add方法,但是失敗了…
public override async Task<int> Add(UserCreateDto userCreateDto, sysUserInfo entity)
{
return 0;
}
提示找不到合適的方法可以覆寫...
請問該怎麼處理呢? 謝謝。
uj5u.com熱心網友回復:
static void Main(string[] args){
D d = new D();
d.AFan(new B1());
d.AFan(new B2());
d.AFan(new C());
}
class A<T>
{
public virtual int AFan(T t)
{
return 0;
}
}
class B1:C
{
}
class B2:C
{
}
class C
{
}
class D:A<C>
{
public override int AFan(C c)
{
return 1;
}
public override int AFan(B1 b1)//未找到合適的方法重寫
{
return 2;
}
public override int AFan(B2 b2)//未找到合適的方法重寫
{
return 3;
}
}
你可以把BaseServices<UserViewModel ,sysUserInfo>里的UserViewModel改為IUserViewModel
public override async Task<int> Add(UserCreateDto userCreateDto, sysUserInfo entity)
重寫時UserCreateDto改為IUserViewModel。
uj5u.com熱心網友回復:
BaseService傳入的泛型是什么?public interface IUserViewModel
{ }
public class UserViewModel : IUserViewModel
{ }
public class UserCreateDto : IUserViewModel
{ }
public interface ISysUserInfoServices
{ }
public class SysUserInfo
{ }
public class BaseService<TViewModel, TEntity>
{
public virtual async Task<int> Add(TViewModel viewModel, TEntity entity)
{
return 0;
}
}
public class SysUserInfoServices : BaseService<UserViewModel, SysUserInfo>, ISysUserInfoServices
{
public override Task<int> Add(UserViewModel viewModel, SysUserInfo entity)
{
return base.Add(viewModel, entity);
}
}
uj5u.com熱心網友回復:
版主您好,BaseService傳入的是…
public class SysUserInfoServices : BaseServices<UserViewModel ,sysUserInfo>, ISysUserInfoServices
uj5u.com熱心網友回復:
還是不行耶,出錯了。
uj5u.com熱心網友回復:
抱歉,這裡有點筆誤…實際上UserCreateDto實際上是繼承自實體類UserViewModel。
public class UserCreateDto : UserViewModel
uj5u.com熱心網友回復:
如果 IA 被繼承 A 繼承,BaseServ<A> 與 BaseServ<IA> 也是毫無繼承關系的兩個模板。你需要為后者創建“新的”Add 方法,并在方法內部將操作委派給其它方法處理。uj5u.com熱心網友回復:
當你使用泛型,它就是創造新代碼的模板。如果你認為模板型別引數是繼承的,那么造出來的兩個模板也是可覆寫的,這就會產生歧義。假設你需要對 BaseServ<IA> 進行封裝,那么你直接寫一個
class SysUserInfoServices: BaseServ<IA>型別就行了,這就是對 BaseServ<IA> 的擴展封裝。
{
}
不應該寫成
class SysUserInfoServices: BaseServ<A>,而且 BaseServ<A> 與 BaseServ<IA> 也根本沒有繼承關系。
{
}
如果你的 SysUserInfoServices 同時具有來自 BaseServ<A>和BaseServ<IA>的特性,那么你應該使用多重繼承或者介面來分別設計與兩類BaseServ有關的擴展代碼。
uj5u.com熱心網友回復:
我將IUserViewModel及UserViewModel的繼承關係解除後,就能夠編譯通過了。public override async Task<int> Add(UserViewModel userCreateDto, sysUserInfo entity)
{
return 0;
}
不過我該怎麼取UserCreateDto的值呢?
另外Controller的部份報錯了…
UserCreateDto temp = new UserCreateDto();
var id = await _sysUserInfoServices.Add(temp, sysUserInfo);
temp顯示錯誤:無法從UserCreateDto轉換為UserViewModel。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/257963.html
標籤:C#
下一篇:多專案生成檔案管理問題
