2

Dataクラスがあります。

そしてDerivedClass : Data

Dataは、データ自体と、そのデータを操作するための多くのメソッドがあります。

ただしDerivedClass、一部のメソッドは悪い結果を引き起こす可能性があるため、これらのメソッドの一部のみを継承する必要があります。( にのみ発生し、 には発生しないDerivedClass問題Data)

newしたがって、それらの一部を非表示にしたい (すべての派生クラスのメソッドを非表示にするために入力するのではなく、基本クラスの一部のアクセサーから)

それは可能ですか?回避策はありますか?

4

2 に答える 2

0

最善の方法は、派生クラスによって変更できるメソッドのみを持つ基本クラスを作成することだと思います。Data クラスは封印され、同じままであり、この基本クラスは Data クラスによって構成されます。コードは次のようになります。

public sealed class Data
{
  private object data; //actual data
  private BaseDataOperations dataOperations; //This class will implement methods

  public void Method1()  //This method is accessible to others but can't be modified
  {
    // manipulate data
  }

  public void Method2()  //This method will be polymorphically performed
  {
      dataOperations.Method2(data);
  }
}

public class BaseDataOperations
{

  public virtual void Method2(object data)  //This method will be polymorphically performed
  {
      //manipulate data
  }
}

public class DerivedDataOperations : BaseDataOperations
{

  public override void Method2(object data)  //This method will be polymorphically performed
  {
      //manipulate data
  }
}
于 2013-06-13T01:32:51.277 に答える
0

シャドウイングを使用して、同じメソッドを正確に実装できます(public、return type、name、parameters) 次に、そのメソッドの派生クラスで新しいロジックを実装します。

class Class1
    {
        public int Get()
        {
            return 1;
        }
        public Class1()
        {

        }

        public virtual void ForBoth()
        {

        }
    }

    class class2 : Class1
    {
        public class2()
        {

        }

        public override void ForBoth()
        {
            base.ForBoth();
        }

        public int Get()
        {
            return 2;
        }

    }

私の例では、シャドウされたメソッドは Get() でした。次の例のように、他のメンバーを変更できます class1 has property int MyInt,and i convert in class2 to a method

class Class1
    {
        public int MyInt = 0;

        public int Get()
        {
            return 1;
        }
        public Class1()
        {

        }

        public virtual void ForBoth()
        {

        }
    }

    class class2 : Class1
    {
        public class2()
        {

        }

        public override void ForBoth()
        {
            base.ForBoth();
        }

        public void MyInt(string s)
        {
            System.Windows.Forms.MessageBox.Show(s);
        }

        public int Get()
        {
            return 2;
        }

    }

これとは別に、これらの「動作」を実装するインターフェースを作成することを検討する必要があります。アダプターパターンをチェックして ください http://www.dofactory.com/Patterns/PatternAdapter.aspx

于 2013-06-13T01:43:33.053 に答える