C# 派生类中方法的选择性可访问性

C# 派生类中方法的选择性可访问性,c#,oop,inheritance,C#,Oop,Inheritance,最近我参加了一次采访,采访者问了一个关于继承的棘手问题。这个问题是基于c 我们有基类ClassA,它有两个方法-Method1(),Method2() 现在我们继承这个类,然后创建ClassB。ClassB的对象应具有可在外部访问的Method1,Method2应隐藏 public class ClassB : ClassA{ } ClassB objB= new ClassB(); objB.Method1(); //should be accessible objB.Method2()

最近我参加了一次采访,采访者问了一个关于继承的棘手问题。这个问题是基于c

我们有基类
ClassA
,它有两个方法-
Method1()
Method2()

现在我们继承这个类,然后创建
ClassB
ClassB
的对象应具有可在外部访问的
Method1
Method2
应隐藏

public class ClassB : ClassA{
}

ClassB objB= new ClassB();

objB.Method1(); //should be accessible 
objB.Method2(); //should not be accessible. 
public class ClassC : ClassA{
}

ClassC objC= new ClassC();

objC.Method1(); //should not be accessible 
objC.Method2(); //should be accessible. 
我们再次从
ClassA
创建另一个类
ClassC
ClassC
的对象应具有可在外部访问的
Method2
Method1
应隐藏

public class ClassB : ClassA{
}

ClassB objB= new ClassB();

objB.Method1(); //should be accessible 
objB.Method2(); //should not be accessible. 
public class ClassC : ClassA{
}

ClassC objC= new ClassC();

objC.Method1(); //should not be accessible 
objC.Method2(); //should be accessible. 

我已经回答了相应的方法的私有访问修改器。面试官没有接受。有没有更明智的方法来实现这一点?

这两种方法都应该在类
A
中受到
保护,这意味着它们只对对象和继承的类内部可见

然后在类
B
中,重新引入方法
Method1
,并将其公开,调用interited方法

在类
C
中,重新引入方法
Method2
,并将其公开,调用interited方法

在重新引入具有现有名称的方法时使用关键字,以澄清意图并防止编译器发出警告

class A
{
    protected void Method1()
    {
    }

    protected void Method2()
    {
    }
}

class B: A
{
    public new void Method1()
    {
        base.Method1();
    }
}

class C : A
{
    public new void Method2()
    {
        base.Method2();
    }
}


class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Method1(); // Not allowed
        a.Method2(); // Not allowed

        B b = new B();
        b.Method1();
        b.Method2(); // Not allowed

        C c = new C();
        c.Method1(); // Not allowed
        c.Method2();
    }
}

为了完整起见,我们鼓励您将其写下来作为一个答案:

你不应该。这种设计是一种代码气味。它暗示了接口分离的问题(可能更多)。所以这将是第一件事,我会回答

但是紧接着@NineBerry的方法,否认“如果不允许我审查设计并只实施要求…”


理由:面试官现在知道我知道设计问题和干净的代码,但尽管我反对,我还是足够熟练地做到这一点,因为毕竟,在某些情况下,无论出于何种原因,重新设计都是不可能的。

是的。虽然“应该隐藏”是不明确的,可能意味着
私有的
受保护的
,甚至是
内部的
,这取决于它应该隐藏给谁。@BiesiGrr“这是微软的文档但是”是的,我给他们写了一个反馈,关于这个例子有多混乱is@BiesiGrr一切皆有可能,但是在面试中的测试环境中看到它,后一种情况变得非常不可能,那么你为什么需要第二个ClassC的例子呢?=@MongZhu嗯,它没有真正回答问题,也没有解决任何问题。我可能会说,我个人——负责这个要求——会质疑设计,但如果我必须这样做,我会这样那样做。。。哦,我讨厌那些“陷阱问题”。好像被采访者还没有处于压力之下。这只是我书中的虐待狂。我通常不喜欢在采访中问编程语言语法问题。软件工程不是要记住所有用例的正确语法。你可以随时查阅。