您好我有一个抽象类,其中有一些公共方法和一些抽象方法。 我有公众,所以他们实现派生类的常用方法。
令我困惑的是为什么我想要定义一个公共抽象方法而不是受保护的抽象方法。对于我来说,在抽象类中定义一个公共抽象方法是没有意义的....因为如果是抽象将在派生类中被覆盖,但同样如果被定义为public,但不知何故定义更有意义它受到保护,因为我们知道我们将在派生类中覆盖它。
在抽象类中将方法定义为公共抽象是不对的?哪个更好,为什么?
答案 0 :(得分:9)
这取决于你想要达到的目标。例如,您有一个Television
类,其中包含3种方法,TurnOn
,TurnOff
和Draw
。
您只希望客户能够TurnOn
或TurnOff
电视,但只有其子类应该知道屏幕上Draw
的内容和方式。因此,Television
或多或少会像下面一样。
public abstract class Television
{
public abstract void TurnOn();
public abstract void TurnOff();
protected abstract void Draw();
}
然后每个公司都有自己的实施。
public sealed class MyTelevision
: Television
{
public override void TurnOn()
{
Console.WriteLine("Turn on my tv");
}
public override void TurnOff()
{
Console.WriteLine("Turn off my tv");
}
protected override void Draw()
{
// code here.
}
}
客户可以TurnOn
或TurnOff
电视,但屏幕上无法Draw
。
答案 1 :(得分:6)
出于同样的原因,你想要一个对象的公共方法:) 您只是不知道此阶段的具体实现。 它在具有很高抽象级别的类中很常见,例如中间件。
编辑:这是100%合法的。您只需要确保它是您希望在每个具体实现中向世界其他地方公开的功能。入口点方法(例如:start,execute,parse ..)通常属于这种类型。
答案 2 :(得分:1)
Abstract Class本身必须像继承它的Classes一样可访问。因此,如果继承的Classes是Public,则Abstract Class也必须是公共的。
Public Abstract与其他公共方法具有相同的想法:如果你有一个抽象类,你将传递这个arround。因此,如果这个方法应该从外部调用,那么它是公开的。如果该方法仅用于Child和Parent之间的通信,则受保护是可行的方法。简单的示例,请参阅Main-Method作为抽象类的用户:
awk 'FNR==NR{a[$1,$2];next} (($1,$2) in a)' file1 file2
a1 45 1/1 784
a1 65 0/1 454
a2 45 0/1 478
a3 32 0/1 658