【问题标题】:Make a method not accessible from derived class but still public使一个方法不能从派生类访问,但仍然是公共的
【发布时间】:2013-06-13 00:47:28
【问题描述】:

我有一个Data 课程。

还有一个DerivedClass : Data

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

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

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

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

【问题讨论】:

  • ...我想了一会儿就知道答案了...但也许会出现一些开明的解决方法。
  • 为什么要公开这个方法?
  • 因为它们是使用 Data 类的用户方法。没有他们,课堂几乎毫无用处。
  • 当然,问题是他们为什么不能是私有的?

标签: c# inheritance hide accessor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2018-04-17
      • 2020-02-11
      • 1970-01-01
      • 2021-07-19
      • 2010-11-01
      相关资源
      最近更新 更多