【问题标题】:Trying to use virtual-like variable in abstract class instance尝试在抽象类实例中使用类虚拟变量
【发布时间】:2013-06-19 07:23:37
【问题描述】:

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

类似这样的:

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

【问题讨论】:

    标签: c# properties virtual field abstract


    【解决方案1】:

    派生类需要能够访问 HandlerID 以覆盖它,因此您需要在抽象类中将其从“私有”更改为“受保护”。

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

    【讨论】:

      【解决方案2】:
      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
      }
      

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

      【讨论】:

      • 除了类中有多个变量以及状态变量之外,这将起作用。我应该在问题中说明这一点。
      • 好的。也许您可以创建一个包含所有变量的单个设置对象并将其作为单个参数传递?这样它也很灵活,如果添加新变量也不会破坏签名
      猜你喜欢
      • 2015-06-09
      • 2019-02-10
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多