主要问题: 我有一个引用类型(对象/类),我想指定访问者的实现细节,但我不希望该类型是可实例化的,只是可扩展的。
抽象类根据我的理解,不允许实体访问属性的访问器,因此这对我来说有些麻烦。
我如何以最“正确”和优雅的方式解决这个问题?
第二个问题: 如果有办法,我还想要重载访问器的功能?一个原因是我有一个枚举属性,我想通过使用它的值(int)或它的枚举引用类型来设置它。
答案 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属性,有些方法声明了它们的实体,而整个类都无法实例化。
希望有所帮助:)