【问题标题】:Call function in derived class (from interface), from base class从基类调用派生类(从接口)中的函数
【发布时间】:2015-04-08 23:02:47
【问题描述】:

编辑:编辑以更好地关注问题。

如何在基类中调用派生类中的方法。我有几个继承自 BaseClass 的类。所有派生类都实现了 IValidation,因此也实现了 ValidateInput 方法。

interface IValidation
{
    public void ValidateInput(string userInput);
}

Public BaseClass : ViewModelBase
public string UserInput
{
    get { return _UserInput; }
    set
    {
        if (value == _UserInput) return;
        _UserInput = value;
        RaisePropertyChanged(() => UserInput);

        //I want to call my validation method here
        //ValidateInput(UserInput);

        UserInputStream.OnNext(value); //UserInputStream is defined as readonly Subject<string> MyPropertyStream = new Subject<string>();
     }
}

public class DerivedCLassOne : BaseClass, IValidation
{
  public DoStuff
  {
       //subject Stream for UserInput
       UserInputStream
          .Throttle(TimeSpan.FromSeconds(1))
          .ObserveOn(Application.Current.MainWindow)
          .Subscribe(GetResults);
  }

  public async void GetResults(string userInput)
  {
      //do stuff
  }

  public void ValidateInput(string userInput)
  {
       //Do validation stuff
  }
}

因为有 5 或 6 个不同的类派生自基类,所以我可以在 BaseClass (DerivedClassOne.ValidateInput) 中使用完全定义的路径到 ValidateInput 方法,因为根据发生的情况,派生类会有所不同。所以 BaseClass 需要知道只在当前使用的派生类中使用 ValidateInput 方法,比如 UserInputStream.OnNext(value);调用。

这可以通过 RX(响应式扩展)来完成吗?在基类上实现 IValidation 是否有帮助?

【问题讨论】:

    标签: wpf class asynchronous system.reactive base-class


    【解决方案1】:

    您可以公开表示用户输入有效性的流:

    class BaseClass 
    {
        IObservable<bool> IsUserInputValid 
        { 
           get 
              { 
                return UserInputStream
                    .Throttle(TimeSpan.FromSeconds(1))
                    .Select(x => IsValid(x))
                    .ObserveOn(Application.Current.MainWindow);
               }
         }
    
         private bool IsValid(string userInput) { return whether the input is valid }
     }
    

    然后将提交按钮和验证消息绑定到 IsUserInputValid 属性。

    我建议你看看很棒的 Reactive UI 框架。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多