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();
    }
}

你怎么看?它是一个优雅且有用的解决方案吗?