簡體   English   中英

接口和抽象類中的C#屬性

[英]C# Properties in interfaces & abstract classes

我只是在編寫一個簡單的C#接口,並在其中放置了一個屬性,而沒有考慮太多。 例如:

public interface IMyInterface
{
    string Name { get; set; }
    object[][] Data { get; set; 
}

我意識到當應用於接口和抽象基類時,我對屬性有些困惑。 在普通類中,此語法將為其在后台生成的隱藏字符串成員生成訪問器和變異器。

接口不應具有數據成員。 那么,在這種情況下,此語法是否有所不同?

那抽象類呢? 如果我在抽象基類和派生類中使用相同的語法,那么兩者最終都將是隱藏成員嗎?

接口不應具有數據成員。

這些是屬性,並且 允許

接口僅包含方法,屬性,事件或索引器的簽名。

另請參見接口上的c#屬性 至於第二個問題:

如果我在抽象基類和派生類中使用相同的語法,那么兩者最終都將是隱藏成員嗎?

是。 您可以通過在基類上將屬性標記為virtual並在派生類上override來防止這種情況。

接口不應具有數據成員。 那么,在這種情況下,此語法是否有所不同?

從技術上講,它不是數據成員-它是具有基礎數據成員的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM