是否可以建立一个抽象类来提供其余的实现

本文关键字:实现 抽象类 一个 建立 是否 | 更新日期: 2023-09-27 18:29:12

有了这样的类,我能把它安装到位吗?

abstract class Mammal {
    public abstract void Foo();
}

我希望类似的东西应该起作用:

Mammal wolf = new Mammal() {
    public void Foo() { Console.WriteLine("Wooo"); }
}

然而,compilier不允许这样做。

是否可以建立一个抽象类来提供其余的实现

看起来您在寻找类似于Java中的匿名内部类的东西。C#中没有等价的。选项:

  • 请改为创建嵌套类
  • 创建一个为每个抽象方法使用委托的实现,然后使用匿名函数"内联"创建这些实现
  • 如果类型仅由一个抽象方法组成,请考虑使用委托而不是要开始的抽象类

抽象类的定义本身就是一个无法实例化的类。此处:

在类声明中使用抽象修饰符来指示类仅作为其他类的基类。成员标记为抽象的或包含在抽象类中的由派生自抽象类的类实现。

话虽如此,它可以有一个构造函数。

您的代码没有多大意义在C#中不起作用。

不,你做不到。参见参考文献

但是你可以继承你自己的类:

public class ConcreetMammal : Mammal 
{
       public void Foo() {Console.WriteLine("Wooo");}
}

如果你想做到这一点,我认为最接近的方法是将Foo设为Action,并为Mammal提供一个构造函数,为Foo分配一个传入函数。

class Mammal {
    public readonly Action Foo;
    public Mammal(Action foo) { Foo = foo;}
}
...
...
var MyMammal = new Mammal(() => {Console.WriteLine("Wooo");});

实际上Skeet所说的可能是这样的(一如既往的伟大输入)。。。

class Test
{
    public delegate void MyFooSig();
    public MyFooSig Foo { get; set; }
}
class Test1
{
    public Action Foo { get; set; }
    public Func<string, int, Test> MyOtherFoo { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        var test = new Test
        {
            Foo = () => Console.Write("I'm in Foo"),
        };
        test.Foo();
        var test1 = new Test1
        {
            Foo = () => Console.WriteLine("Foo via Action delegates"),
            MyOtherFoo = (s, i) => new Test 
            { 
                Foo = () => Console.WriteLine("here it's me again..."),
            },
        };
        test1.Foo();
        test1.MyOtherFoo("", 1).Foo();
    }
}

但事情不一样
(注意,这不是继承,类不是抽象的,它更多的是对同一个的实例化)此外,还有动态对象-您可能想看看Mock for C#,了解一些想法