2011-12-23 62 views
0

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

抽象根据我的理解,类不允许物体访问属性的访问器,所以这对我来说很麻烦。

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

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

回答

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 
    } 
} 

有用于设置枚举适当两个重载方法ty和一些方法声明了他们的身体,而整个类不能被实例化。

希望帮助:)

+0

谢谢,那就做到了! – Vort3x

2

抽象类不允许机构属性的访问器,据我了解

是他们不...这是完全合法的

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

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

+0

我相信我可能会混淆它们。我对c#很陌生,正在阅读文档。我在msdn的文档中误解了一行,内容如下:“从抽象类派生的非抽象类必须包含所有继承的抽象方法和访问器的实际实现。“我假设,连同这个例子,我们不能把主体放在访问器中,感谢你清除它 – Vort3x

+2

你应该从上面的引用中得到什么是抽象类可以有抽象方法/访问器,如果它们确实具体派生类必须提供一个实现,但是如果抽象类提供了一个实现,那么派生类不需要。 –

2

摘要根据​​我的理解,类不允许物体作为 属性的访问器,所以这对我来说会造成一些麻烦。

是的,他们做;

public abstract class Foo 
{ 
    public string Prop 
    { 
     get { return "yesTheyDo"; } 
    } 
} 

你把它们标记为抽象?

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() { }