开发者

C# Inheritance Problem

开发者 https://www.devze.com 2023-03-30 07:13 出处:网络
Let\'s say I have 3 classes: GrandDad, Dad and Son. Son inherits from Dad, which inheri开发者_Go百科ts from GrandDad.

Let's say I have 3 classes:

GrandDad, Dad and Son. Son inherits from Dad, which inheri开发者_Go百科ts from GrandDad.

GrandDad has 2 methods:

public virtual void foo();
public virtual void do();

Dad inherits foo(), but overrides do();

public override void do();

If Son wants to modify foo(), is it acceptable to:

make Dad override foo(), but simply call foo.base()? Then Son can override foo(), but Dad's foo() functionality remains the same?

Or is that a hacky way?


As long as Dad never defined a foo(), there's no reason he has to do anything. Son should be able to override foo() from GrandDad.


If I've understood your question, there's no need to do anything with Dad. Simply implement foo() within Son.

As Son is a descendant from Dad, nothing within Son changes Dad, so if Son implements foo(), Dad's foo() remains the same, inheriting from GrandDad.


Dad doesn't have to override foo(). Since Dad simply inherits the version supplied by Granddad (which is still virtual), that means that's what Son gets, too, allowing Son to override foo().

public class Granddad {
    public virtual void foo() {...}
    public virtual void do() {...}
}

public class Dad {
    public override void do() {...}
}

public class Son {
    public override void foo() {...}
}


The semantics of the problem may have lead you astray.

If you are REALLY doing Father, Son, Grandfather...

You only need one class: Person. It will have a member property called Father that will point to another Person. This way, you can have many generations instead of being locked in at three.


What do you mean by modify foo? If you mean override, then Son can simply override foo(). No need to make Dad override foo() calling base implementation.


Dad doesn't need to override Foo for Son to override Foo. Foo is virtual all the way up the inheritance chain unless someone overrides it AND declares it sealed.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号