C# Base Class 强制在依赖 class 但参数不同的情况下创建函数
C# Base Class forces to create a function in a dependent class but different parameters
我正在为一个应用程序创建一个很长的同步过程,我不想忘记一些东西。对于每个 table 我必须遵循相同的程序但参数不同。
这是一项漫长而无聊的工作。出于这个原因,我应该在基础 class 中有一个约束,它迫使我用不同的参数实现一些功能。
例如
bool DeleteRecordFromTable(SyncResultTable1 sync, bool ExecuteScript = true)
bool InsertRecordFromTable(SyncResultTable1 sync)
bool UpdateRecordFromTable(SyncResultTable1 sync, string text)
bool DeleteRecordFromTable(SyncResultTable2 sync, int value1)
...
bool DeleteRecordFromTable(SyncResultTable(n) sync, bool IsDelete, int value1)
bool InsertRecordFromTable(SyncResultTable(n) sync, DateTime dtExecute)
bool UpdateRecordFromTable(SyncResultTable(n) sync, [...])
你可以尝试这样做:
将您的 SyncResult 定义为接口实现
interface ISyncResultTable
{
}
public class SyncResultTable1 : ISyncResultTable
{
}
public class SyncResultTable2 : ISyncResultTable
{
}
等..
interface ITable<T> where T:ISyncResultTable
{
bool DeleteRecordFromTable(T sync, bool ExecuteScript)
bool InsertRecordFromTable(T sync, bool ExecuteScript)
bool UpdateRecordFromTable(T sync, bool ExecuteScript)
}
你可以这样写 类:
public class Table1 : ITable<SyncResultTable1>
好的,我找到了我的解决方案。我不知道这是否是世界上最好的解决方案,但我喜欢它并接受建议。
首先,我定义了我的基础 class,其中包含所有常用函数和 INotifyPropertyChanged
的实现
Base class with T 和 INotifyPropertyChanged
public abstract class BaseSyncClass<T> : INotifyPropertyChanged where T : SyncResultBase {
private readonly ISyncData _syncData;
public BaseSyncClass(ISyncData syncData) {
_syncData = syncData;
}
public abstract string UpdateRecordFromTable(T sync);
public abstract string UpdateRecordFromTableNoSyncId(List<T> sync);
public void UpdateFromServer(List<T> result) {
foreach (T sync in result) {
UpdateRecordFromTable(sync);
}
}
}
然后当我在上面创建一个新的class时,我可以有所有的方法来实现
实现示例
public class ListingConditionTableSync : BaseSyncClass<SyncResultCondition> {
public ListingConditionTableSync(ISyncData syncData) : base(syncData) {
}
public override string UpdateRecordFromTable(SyncResultCondition sync) {
throw new NotImplementedException();
}
public override string UpdateRecordFromTableNoSyncId(List<SyncResultCondition> sync) {
throw new NotImplementedException();
}
}
你怎么看?它是一个优雅且有用的解决方案吗?
我正在为一个应用程序创建一个很长的同步过程,我不想忘记一些东西。对于每个 table 我必须遵循相同的程序但参数不同。
这是一项漫长而无聊的工作。出于这个原因,我应该在基础 class 中有一个约束,它迫使我用不同的参数实现一些功能。
例如
bool DeleteRecordFromTable(SyncResultTable1 sync, bool ExecuteScript = true)
bool InsertRecordFromTable(SyncResultTable1 sync)
bool UpdateRecordFromTable(SyncResultTable1 sync, string text)
bool DeleteRecordFromTable(SyncResultTable2 sync, int value1)
...
bool DeleteRecordFromTable(SyncResultTable(n) sync, bool IsDelete, int value1)
bool InsertRecordFromTable(SyncResultTable(n) sync, DateTime dtExecute)
bool UpdateRecordFromTable(SyncResultTable(n) sync, [...])
你可以尝试这样做:
将您的 SyncResult 定义为接口实现
interface ISyncResultTable
{
}
public class SyncResultTable1 : ISyncResultTable
{
}
public class SyncResultTable2 : ISyncResultTable
{
}
等..
interface ITable<T> where T:ISyncResultTable
{
bool DeleteRecordFromTable(T sync, bool ExecuteScript)
bool InsertRecordFromTable(T sync, bool ExecuteScript)
bool UpdateRecordFromTable(T sync, bool ExecuteScript)
}
你可以这样写 类:
public class Table1 : ITable<SyncResultTable1>
好的,我找到了我的解决方案。我不知道这是否是世界上最好的解决方案,但我喜欢它并接受建议。
首先,我定义了我的基础 class,其中包含所有常用函数和 INotifyPropertyChanged
Base class with T 和 INotifyPropertyChanged
public abstract class BaseSyncClass<T> : INotifyPropertyChanged where T : SyncResultBase {
private readonly ISyncData _syncData;
public BaseSyncClass(ISyncData syncData) {
_syncData = syncData;
}
public abstract string UpdateRecordFromTable(T sync);
public abstract string UpdateRecordFromTableNoSyncId(List<T> sync);
public void UpdateFromServer(List<T> result) {
foreach (T sync in result) {
UpdateRecordFromTable(sync);
}
}
}
然后当我在上面创建一个新的class时,我可以有所有的方法来实现
实现示例
public class ListingConditionTableSync : BaseSyncClass<SyncResultCondition> {
public ListingConditionTableSync(ISyncData syncData) : base(syncData) {
}
public override string UpdateRecordFromTable(SyncResultCondition sync) {
throw new NotImplementedException();
}
public override string UpdateRecordFromTableNoSyncId(List<SyncResultCondition> sync) {
throw new NotImplementedException();
}
}
你怎么看?它是一个优雅且有用的解决方案吗?