[英]C# Properties in interfaces & abstract classes
我只是在編寫一個簡單的C#接口,並在其中放置了一個屬性,而沒有考慮太多。 例如:
public interface IMyInterface
{
string Name { get; set; }
object[][] Data { get; set;
}
我意識到當應用於接口和抽象基類時,我對屬性有些困惑。 在普通類中,此語法將為其在后台生成的隱藏字符串成員生成訪問器和變異器。
接口不應具有數據成員。 那么,在這種情況下,此語法是否有所不同?
那抽象類呢? 如果我在抽象基類和派生類中使用相同的語法,那么兩者最終都將是隱藏成員嗎?
接口不應具有數據成員。 那么,在這種情況下,此語法是否有所不同?
從技術上講,它不是數據成員-它是具有基礎數據成員的get / set方法對。 沒有實現。
那抽象類呢? 如果我在抽象基類和派生類中使用相同的語法,那么兩者最終都將是隱藏成員嗎?
如果該類是抽象的,並且該屬性是virtual
則是,您將用另一個自動實現的屬性(沒有意義)覆蓋一個自動實現的屬性。
如果類是抽象的,並且該屬性不是virtual
則您仍然有兩個實現,但是基類將隱藏父實現而不是覆蓋它(如果它們都是自動實現的,那仍然沒有意義)。
如果屬性是抽象的,則抽象類不會有一個實現。 你必須實現你的具體類了get / set( 可能是自動實現的機器人不必須的)。
接口中的屬性聲明與實現完全分開。 因此,您可以使用自動屬性來實現它
private class MyImpl : IMyInterface
{
public string Name { get; set; }
public object[][] Data { get; set; }
}
或聲明自己的支持字段
private class MyImplBacked : IMyInterface
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public object[][] Data { get; set; }
}
抽象類中的相同場景
public abstract class MyAbstractClass
{
public abstract string Name { get; set; }
public abstract object[][] Data { get; set; }
}
private class MyImpl : MyAbstractClass
{
public override string Name { get; set; }
public override object[][] Data { get; set; }
}
private class MyImplBacked : MyAbstractClass
{
private string _name;
public override string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public override object[][] Data { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.