尝试在抽象类实例中使用类似虚拟的变量

时间:2013-06-22 05:05:40

标签: c# properties virtual field abstract

我试图弄清楚如何编写一个基类提供访问器函数的类,然后实例类只需要提供值。

这样的事情:

public interface IBaseClass
{
    int GetHandlerID();
}

public abstract class AbstractClass : IBaseClass
{
    private int HandlerID;

    public virtual int  GetHandlerID()
    {
        return (this.HandlerID);
    }

}

public class MyClass : AbstractClass
{
    int HandlerID = 1;
}


class Program
{
    static void Main(string[] args)
    {
        MyClass newClass = new MyClass();
        Console.WriteLine("HandlerID: {0}"), newClass.GetHandlerID() );
    }
}

它不能以这种方式工作,因为该类将读取AbstractClass中的HandlerID而不是MyClass变量。使用Virtual或Abstract对变量无效,所以除了必须在每次派生新类时实现属性时,我不知道如何做到这一点。

我正在尝试做的是为人们提供构建自己的插件类的接口,它将使用随基类提供的访问器方法。我不想每次创建类的新实例时都必须实现相同的属性方法。


我找到了一种方法来做我想做的事。这样我可以在基类中使用默认的getter / setter,而不必在每个使用基类的定义中创建它们。这不是我想要的,但它会起作用。

public abstract class AbstractClass : IBaseClass
{
    private int m_HandlerID = 0;

    public int HandlerID
    {
        get { return (this.m_HandlerID); }
        set { this.m_HandlerID = value; }
    }

    private string m_HandlerDescription = "undefined";

    public string HandlerDescription
    {
        get { return this.m_HandlerDescription; }
        set { this.m_HandlerDescription = value; }
    }
}

public class MyClass: AbstractClass
{
    public MyClass()
    {
        HandlerID = 1;
        HandlerDescription = "MyClass";
    }
}


class Program
{
    static void Main(string[] args)
    {
        MyClass newClass = new MyClass();
        Console.WriteLine("Handler: {0}[{1}]", newClass.HandlerDescription, newClass.HandlerID);
    }
}

2 个答案:

答案 0 :(得分:0)

public abstract class AbstractClass : IBaseClass
{
    public AbstractClass(int handlerId)
    {
       this.HandlerId = handlerId;
    }
    public int  GetHandlerID()
    {
      return (this.HandlerID);
    }
}

public class MyClass : AbstractClass
{
    public MyClass():base(1)//specific handler id
}

如何通过基础构造函数传递值

答案 1 :(得分:0)

派生类需要能够访问HandlerID来覆盖它,因此您需要在抽象类中将其从“private”更改为“protected”。

public interface IBaseClass
{
    int GetHandlerID();
}

public abstract class AbstractClass : IBaseClass
{
    protected virtual int HandlerID { get; set; }

    public virtual int GetHandlerID()
    {
        return (HandlerID);
    }
}

public class MyClass : AbstractClass
{
    private int _handlerID = 1;
    protected override int HandlerID { get { return _handlerID; } set { _handlerID = value; } }
}


private static void Main(string[] args)
{
    var newClass = new MyClass();
    Console.WriteLine("HandlerID: {0}", newClass.GetHandlerID());
    Console.ReadKey();
}