使一个方法无法从派生类访问,但仍然是公共的

时间:2013-06-13 00:47:28

标签: c# inheritance hide accessor

我有一个Data课程。

DerivedClass : Data

Data拥有数据本身以及许多处理这些数据的方法。

但是DerivedClass必须只继承部分方法,因为其中一些方法可能会导致错误的结果。 (仅发生在DerivedClass但不发生在Data)的问题

所以我希望隐藏它们中的一部分(来自基类中的一些存取器,而不是键入new来隐藏每个派生类的方法)

这可能吗?有解决方法吗?

2 个答案:

答案 0 :(得分:0)

我认为最好的方法是创建一个只有方法可以被派生类修改的基类。数据类将被密封并仍保持不变,此基类将由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
  }
}

答案 1 :(得分:0)

你可以使用Shadowing,完全实现相同的方法(公共,返回类型,名称,参数) 然后在该方法的派生类中实现新逻辑。

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具有属性int MyInt,并且我在class2中转换为方法

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