كيف تسخر من حقل محمي؟
-
27-09-2019 - |
سؤال
أحاول أن أسخر من حقل محمي في الفصل NodeIdGenerator
. أريد ضبط قيمة الحقل في مُنشئ ثم اتصل على GetNext()
الطريقة التي تنتمي NodeIdGenerator
.
أنا متأكد من أن اختباري على ما يرام:
public class NodeIdGeneratorTests
{
[Fact(DisplayName = "Throws OverflowException when Int32.MaxValue " +
"IDs is exceeded")]
public void ThrowsOverflowExceptionWhenInt32MaxValueIdsIsExceeded()
{
var idGenerator = new NodeIdGeneratorMock(Int32.MaxValue);
Assert.Throws(typeof(OverflowException),
() => { idGenerator.GetNext(); });
}
/// <summary>
/// Mocks NodeIdGenerator to allow different starting values of
/// PreviousId.
/// </summary>
private class NodeIdGeneratorMock : NodeIdGenerator
{
private new int? _previousId;
public NodeIdGeneratorMock(int previousIds)
{
_previousId = previousIds;
}
}
}
مشكلتي في فئة وهمية. عندما أتصل GetNext()
في اختباري ، يستخدم _previousId
كائن ينتمي إلى الفئة الفائقة ، وليس الكائن الذي أريده استخدامه (في فئة وهمية.)
لذا ، كيف أسخر من الحقل المحمي؟
ملاحظة: لقد قرأت هذا السؤال لكن لا يمكنني أن أبدو رأسًا ولا ذيلًا!
المحلول
يعلن الرمز الذي نشرته _previousId
مثل new
, ، لذلك يخفي حقل الفئة الأساسية - لا يتجاوزه. لن تستخدم الفئة الأساسية هذه القيمة عند الاتصال GetNext
, ، سوف تستخدم مجالها الخاص.
حاول إزالة إعلانك والوصول إلى الحقل المحمي "الفئة".
نصائح أخرى
إذا كان ذلك ممكنًا ، فسيكون من الأفضل القيام به previousId
خاصية افتراضية وتجاوز getter في وهمية:
public class NodeIdGenerator
{
protected virtual int? PreviousId { ... }
}
private class NodeIdGeneratorMock : NodeIdGenerator
{
protected override int? PreviousId
{
get { return _previousId; }
}
}