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

本文关键字:访问 仍然是 派生 一个 不能 方法 | 更新日期: 2023-09-27 18:18:21

我有一个Data类。

和一个DerivedClass : Data

Data本身具有数据和许多处理该数据的方法。

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

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

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

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

我认为最好的方法是创建一个基类,它只有可以被派生类修改的方法。数据类将被密封并保持不变,这个基类将由数据类组成。代码如下所示:

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

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

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