C# 类固有于类的派生版本或基版本

本文关键字:版本 派生 于类 | 更新日期: 2023-09-27 17:57:00

给定下面的示例,是否可以使用 ClassyFoo 扩展类 Foo,并让 ClassyFoo 从 ClassyFoo 创建 Bar 实例,同时保持 Foo 创建的 Bar 实例仍然继承自 Foo?

例如:

    class Foo
    {
        protected Foo()
        {
            Console.WriteLine("Setting up Foo");
        }
        public static void Show()
        {
            Console.WriteLine("Showing Foo");
            var bar = new Bar();
        }
    }
    class ClassyFoo : Foo
    {
        public ClassyFoo() : base()
        {
            Console.WriteLine("Setting up Classy Foo");
        }
        public new static void Show()
        {
            Console.WriteLine("Showing Classy Foo");
            var bar = new Bar();
        }
    }
    class Bar: Foo
    {
        public Bar() : base()
        {
            Console.WriteLine("Setting up Bar");
        }
    }

ClassyFoo.Show() 的期望输出是:

显示优雅的 Foo
设置 Foo
设置优雅的 Foo
设置酒吧

Foo.Show() 的输出是:

显示符
设置 Foo
设置酒吧

情况是类 Bar 为 Foo 添加了一些配置/专用化,但 Classy Foo 也是如此。但是Bar和ClassyFoo的专业化可以存在于同一个对象上。

我试图避免有一个从 ClassyFoo 继承的重复的 Bar。实际上,有多个条形图,但只有一个ClassyFoo,所以这将是大量的重复。

C# 类固有于类的派生版本或基版本

我会说这是不可能的。一个类只有一个基类。

你可以实现 ClassyFoo 和/或 Bar 作为接口,并让实际的类继承自一个,或另一个,或两者。

根据实际的表示和代码重用,我会使两个接口(类似的处理)或一个抽象类(你可以在那里塞一堆代码)

不确定您要实现的目标,但是您调用了引用Bar实例的Foo.Show()与ClassyFoo si无关,您绝不能期望从那里获得任何东西。

因为C#不支持多重继承,你必须使用接口,不使用接口你就不能这样做。