2012-06-12 71 views
3

我需要两个略有不同的类,它们具有相同的成员,但其中一个类需要用户具有较少的交互可能性。我希望继承第一堂课的第二堂课。
有没有办法从子类中限制对父方法的访问,以便如果有人创建子对象,他们将无法访问某些父类方法(在父类中是公共的)?C#:Child类可以限制对父类方法的访问吗?

+1

不是您所想,没有了道路。 – saluce

+0

不,但如果你举一个更具体的例子,你可能会得到一些更好的想法。 –

+0

即使您可以限制子类中可用的成员,用户仍然可以将其作为父级转换并获取父级功能。你最好的选择是遵循RJ Lohan的回答,但是你会遇到可用性问题,因为你的用户需要知道子类中可用的功能。 –

回答

6

你应该有一个抽象基类来共同拥有两个类的东西,然后让另外两个类继承它并添加方法和属性等

abstract class MyBaseClass 
{ 
    public int SharedProperty { get; set; } 

    public void SharedMethod() 
    { 
    } 
} 

class MyClass1 : MyBaseClass 
{ 
    public void Method1() 
    { 
    } 
} 

class MyClass2 : MyBaseClass 
{ 
    public void Method2() 
    { 
    } 
} 

MyClass1有:SharedPropertySharedMethodMethod1

MyClass2具有:SharedProperty,SharedMethodMethod2

2

不完全,没有。最接近的可能是在基类(父类)中提供虚拟方法,并在派生(子)类中重写/新的方法,并且在适当的情况下不提供行为或例外;

public class Base 
{ 
    public virtual void DoSomething() 
    { . . . } 
} 

public class Derived : Base 
{ 
    public override void DoSomething() 
    { 
     throw new NotSupportedException("Method not valid for Derived"); 
    } 
} 
+0

编辑为抛出'NotSupportedException'而不是'InvalidOperationException',因为它更标准和逻辑,并且添加了缺少的'Base'继承。 – SimpleVar

5

没有,这里的原因:

class Animal { 
    public void Speak() { Console.WriteLine("..."); } 
} 

class Dog : Animal { 
    remove void Speak(); // pretend you can do this 
} 

Animal a = GetAnAnimal(); // who knows what this does 

a.Speak(); // It's not known at compile time whether this is a Dog or not 
+0

不错的例子,这是完美的,为什么我想要的不可能发生。 – 3Pi

0

创建的基类,并应该被隐藏受保护的方法。

创建要公开

创建一个子类,从基类继承的声明方法的接口,并明确实现的接口。从接口实现方法调用受保护的方法。

然后子类的用户只能看到接口的成员(这需要他们投的实例作为接口)

相关问题