C# 派生类中方法的选择性可访问性
最近我参加了一次采访,采访者问了一个关于继承的棘手问题。这个问题是基于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()
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嗯,它没有真正回答问题,也没有解决任何问题。我可能会说,我个人——负责这个要求——会质疑设计,但如果我必须这样做,我会这样那样做。。。哦,我讨厌那些“陷阱问题”。好像被采访者还没有处于压力之下。这只是我书中的虐待狂。我通常不喜欢在采访中问编程语言语法问题。软件工程不是要记住所有用例的正确语法。你可以随时查阅。