[英]Inherit abstract class inside another abstract class with same function names
[英]Why does resharper prefer to not hide a property from an abstract class inside another abstract class?
為什么重新交換者希望我不要對抽象類隱藏屬性? 它希望我使用'new',但這總是更可取嗎? 似乎暗示着隱藏變量以使用戶無法執行base.property是一件壞事。
我對這個OO概念感到有些困惑,並且想知道是否有充分的理由支持或反對它。
我有
public abstract class baseClass{
protected string commonProperty {get; set;}
}
public abstract class moreSpecificBaseClass : baseClass {
// Resharper would prefer I use 'new' below
protected string commonProperty = "Some specific setting";
}
public class verySpecificClass : moreSpecificBaseClass {
// Some code
}
從MSDN文檔 :
盡管您可以在不使用new修飾符的情況下隱藏成員,但結果是警告。 如果使用new來顯式隱藏成員,則會抑制此警告並記錄派生版本旨在替代的事實。
隱藏班級成員可能會導致誤解和微妙的錯誤。 因此編譯器會警告您,並要求您通過使用“new”修飾符使您可能有害成員的意圖隱藏。 這可以防止意外隱藏基礎類型成員而不被忽視。
查看隱藏成員時問題如何隱藏到代碼中的小例子:
public abstract class A
{
public int Value = 0;
}
public class B : A
{
// This hides the Value member from the base type A
public new int Value = 0;
}
static void SetValue(B obj, int value)
{
obj.Value = value;
}
static void AddToValue(A obj, int value)
{
obj.Value += value;
}
static void Main(string[] args)
{
B obj = new B();
SetValue(obj, 11);
AddToValue(obj, 5);
Console.Out.WriteLine("obj.Value = " + obj.Value);
Console.Out.WriteLine("((A) obj).Value = " + ((A) obj).Value);
Console.Out.WriteLine("((B) obj).Value = " + ((B) obj).Value);
}
這將輸出:
obj.Value = 11
((A) obj).Value = 5
((B) obj).Value = 11
僅查看Main方法的流程,您可能會認為在該方法的末尾obj.Value的值為16(= 11 + 5)。 但事實並非如此 - 更糟糕的是:根據您訪問Value成員的方式,您將遇到不同的值。
現在,在這個小例子中,在所有情況下輸出都不相同且期望值不同的原因可能很容易並且很容易找到。 但是,想象一下大型軟件項目,其中包含許多類,大量繼承,方法參數是抽象基類或接口類型,第三方類庫,您可以將其命名為……,並且隱藏成員引起的問題可能變得更加難以解決。鑒別。
如果您不希望外部世界能夠訪問base.property,則應該對其進行保護。 如果是,則不應在派生類中重新定義它。 如果它根本不可用於派生類,請將其設為私有。
它暗示了新的防止歧義,但實際上你不應該在那里開始。
原因是如果我這樣做:
var item = new verySpecificClass();
var val = item.commonProperty;
var basic = (baseClass)item;
if(val == basic.commonProperty)
我將得到與合理的程序員所期望的不同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.