派生 class 中的调用函数(来自接口),来自基础 class
Call function in derived class (from interface), from base class
编辑:编辑以更好地关注问题。
如何在基 class 中调用派生 class 的方法。我有几个继承自 BaseClass 的 classes。所有派生的 classes 都实现了 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 个不同的 class 派生自基础 class,我可以使用完全定义的路径到 BaseClass (DerivedClassOne.ValidateInput) 中的 ValidateInput 方法,因为根据发生的情况,派生的 class 会有所不同。因此 BaseClass 需要知道只使用当前正在使用的派生 class 中的 ValidateInput 方法,例如 UserInputStream.OnNext(value);调用确实。
这可以用 RX(响应式扩展)来完成吗?在基础 class 上实施 IValidation 是否有帮助?
您可以公开表示用户输入有效性的流:
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 框架。
编辑:编辑以更好地关注问题。
如何在基 class 中调用派生 class 的方法。我有几个继承自 BaseClass 的 classes。所有派生的 classes 都实现了 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 个不同的 class 派生自基础 class,我可以使用完全定义的路径到 BaseClass (DerivedClassOne.ValidateInput) 中的 ValidateInput 方法,因为根据发生的情况,派生的 class 会有所不同。因此 BaseClass 需要知道只使用当前正在使用的派生 class 中的 ValidateInput 方法,例如 UserInputStream.OnNext(value);调用确实。
这可以用 RX(响应式扩展)来完成吗?在基础 class 上实施 IValidation 是否有帮助?
您可以公开表示用户输入有效性的流:
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 框架。