抽象类和访问器

时间:2011-12-23 08:24:14

标签: c# abstract-class accessor

主要问题: 我有一个引用类型(对象/类),我想指定访问者的实现细节,但我不希望该类型是可实例化的,只是可扩展的。

抽象类根据我的理解,不允许实体访问属性的访问器,因此这对我来说有些麻烦。

我如何以最“正确”和优雅的方式解决这个问题?

第二个问题: 如果有办法,我还想要重载访问器的功能?一个原因是我有一个枚举属性,我想通过使用它的值(int)或它的枚举引用类型来设置它。

4 个答案:

答案 0 :(得分:2)

  

就我所理解的而言,抽象类不允许实体访问属性的访问器

是的,他们这样做......这是完全合法的

abstract class MyBaseClass
{
    private int _myProperty;
    public int MyProperty
    {
        get { return _myProperty; }
        set { _myProperty = value; }
    }
}

也许你会混淆抽象类和接口;接口可以声明成员,但是它们不能为这些成员提供实现。

答案 1 :(得分:2)

  

Abstract类不允许body作为Properties的访问器   据我所知,这让我有些麻烦。

是的,他们这样做;

public abstract class Foo
{
    public string Prop
    {
        get { return "yesTheyDo"; }
    }
}
你把它们标记为抽象吗?

答案 2 :(得分:1)

您可以在abstract class内定义方法和属性的主体。它的抽象部分基本上只是阻止它被实例化。为此,您可以正常编写属性:

public string Name
{
    get { return "SomeName"; }
}

举个例子。至于允许重载加载器,您可以执行以下操作之一:

// By setting this as 'virtual' you can allow classes that inherit from this to override the functionality if they so wish
public virtual string Name
{
    get { return "SomeName"; }
}

// or
public virtual string GetName()
{
    return "SomeName";
}

一个提示:如果您希望覆盖功能并且只能继承抽象类的类,请使用protected关键字:

protected virtual void DoSomething() { }

答案 3 :(得分:1)

我认为这应该做你想要的:

public abstract class MyParentClass
{
    public enum MyEnum
    {
        one,
        two,
        three
    }

    private MyEnum _enumeration;

    public string Name { get; private set; }
    public MyEnum Enumeration { get { return this._enumeration; } }
    public void SetEnumeration(string value)
    {
        // ... do something
    }
    public void SetEnumeration(MyEnum value)
    {
        // ... do something
    }
}

有两种重载方法可以设置Enumeration属性,有些方法声明了它们的实体,而整个类都无法实例化。

希望有所帮助:)