0

基本クラスがアクセサー関数を提供し、インスタンス化されたクラスが値を提供するだけでよいクラスを作成する方法を見つけようとしています。

このようなもの:

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

クラスは MyClass 変数の代わりに AbstractClass の HandlerID を読み取るため、この方法では機能しません。Virtual または Abstract の使用は変数に対して有効ではないため、新しいクラスが派生するたびにプロパティを実装する必要がある以外に、これを行う方法がわかりません。

私がやろうとしているのは、人々が独自のプラグイン クラスを構築するためのインターフェイスを提供することであり、基本クラスで提供されるアクセサー メソッドを使用します。クラスの新しいインスタンスを作成するたびに、同じプロパティ メソッドを実装する必要はありません。


私は自分がやりたいことをする方法を見つけました。このようにして、基本クラスにデフォルトのゲッター/セッターを持たせることができ、基本を使用する各定義でそれらを作成する必要がなくなります。それは私が探していたものではありませんが、うまくいきます。

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

2 に答える 2

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
}

基本コンストラクターを介して値を渡すのはどうですか

于 2013-06-22T05:12:29.880 に答える
0

派生クラスは、上書きするために 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();
}
于 2013-06-22T05:29:29.027 に答える