【发布时间】:2017-01-11 13:53:37
【问题描述】:
我有两个班级,Sensor 和 Channel。它们通过在通道中“插入”传感器来使用(即,使用Sensor 实例设置Channel 的Sensor 属性)。然后,当您使用非空传感器在Channel 中调用AddSamples 时,将通知Sensor.WhenNewSamples 的订阅者:
public abstract class Channel
{
public Sensor Sensor { get; set; }
public abstract void AddSamples(IEnumerable<double> samples)
}
public abstract class Sensor
{
public abstract IObservable<double> WhenNewSamples { get; }
internal abstract void AddSamples(IEnumerable<double> samples);
}
我想要实现的是一种在内部传递这些样本的方法,而不必创建暴露的Sensor.AddSamples。此外,当然,它应该与在其他程序集中定义的子类一起使用,因为 Sensor 和 Channel 是抽象的,并且在域模型库中定义。
更新:
以下实现可以,但它无法编译,因为Sensor.AddSamples 是内部的,而派生类在其他程序集中:
public class ConcreteChannel : Channel
{
public override void AddSamples(IEnumerable<double> samples)
{
// AddSamples below is inaccessible
Sensor.AddSamples(samples);
}
}
public class ConcreteSensor : Sensor
{
Subject<double> _subject = new Subject<double>();
public override IObservable<double> WhenNewSamples
{
get { return _subject.AsObservable(); }
}
// "No suitable method found to override"
internal override void AddSamples(IEnumerable<double> samples)
{
samples.ToList().ForEach(s => _subject.OnNext(s));
}
}
【问题讨论】:
-
使
AddSamples受保护?然后它只对派生类可见。还是我理解错了? -
@HimBromBeere 我希望
Channel.AddSamples公开,但我不知道如何封装从Channel到Channel.Sensor的数据传递,而不创建公开的Sensor.AddSamples,我想避免。我正在寻找一种“魔术隧道”,我只能在一个类中添加样本,并且它会在另一个类中弹出,前提是它们彼此“连接”(即,Channel.Sensor属性已设置到Sensor的一个实例)。查看我的更新。 -
如果您需要从类和程序集外部访问成员,那么它应该是
public。没有办法解决这个问题。 -
您是否尝试将 AddSamples 声明为“受保护的内部”?您甚至可以在另一个程序集中创建的子类中继承它。
-
@ChetanRanpariya 这仍然不会提供从
ConcreteChannel中访问该成员的权限。
标签: c# access-modifiers