gpt4 book ai didi

c# - 在类中添加不在接口(interface)定义中的公共(public)方法是一个好习惯吗?我什么时候应该这样做?

转载 作者:行者123 更新时间:2023-12-01 22:19:19 25 4
gpt4 key购买 nike

不太清楚 OOP 概念,可能是一个愚蠢的问题,请忽略它的愚蠢:-)

该问题与以下类(class)相关。我在那里添加了一个公共(public)方法“TestMethod()”,该方法未在接口(interface)中定义(如下)。

  1. 这是一种不好的做法吗?所有方法都必须在接口(interface)中定义吗?
  2. 在什么情况下我可以在类中实现公共(public)方法/成员,但不能在接口(interface)中实现?

界面...

public interface IAnimals
{
void MakeNoise(string noise);
void Move();
string Color
{
get;
set;
}
}

类的实现...

class Animal : IAnimals
{
private string color;
string IAnimals.Color
{
get
{
return color;
}
set
{
color = value;
}
}
void IAnimals.MakeNoise(string noise)
{
Console.WriteLine("Animal " + noise);
}
void IAnimals.Move()
{
Console.WriteLine("Animal moves");
}
public void TestMethod()
{
Console.WriteLine("test method in Animal class");
}
}

该计划...

class Program
{
static void Main(string[] args)
{
//Animal1 show methods and properties defined in the Interface
IAnimals animal1 = new Animal();

//Animal2 only shows the public method of Animal class
Animal animal2 = new Animal();

animal1.Color = "Red";
Console.WriteLine("Animal's color is " + animal1.Color);
animal1.MakeNoise("Barks");
animal1.Move();


animal2.TestMethod();

Console.ReadLine();
}
}

以及输出...

Animal's color is Red

Animal Barks

Animal moves

test method in Animal class

最佳答案

我的方法是这样的。

一个类的目标应该是承担一种责任(单一责任原则),并且它的公共(public)契约(即可公开访问的成员)应该与其履行的责任相关。

我不会尝试强制具体类公共(public)成员和接口(interface)公共(public)成员之间的关联。一个类可能有一个公共(public)成员,以便满足与它正在实现的接口(interface)契约无关的横切关注点,但与实现细节完全相关。或者它甚至可能实现多个接口(interface)或一些对其职责没有任何意义的接口(interface)(例如 IDisposable)。

这是否是潜在问题取决于您如何公开此契约(Contract)。我倾向于公开接口(interface)来提供行为,因为它允许我使用 DI 容器等来管理实现配置,这反过来又允许我模拟接口(interface)或提供用于单元测试目的的测试实现。也就是说,如果您正在传递具体类型(这也是有效的“契约(Contract)”),那么该类型的公共(public)面会形成隐含契约(Contract),因此您需要小心更改它(就像您要小心更改接口(interface)定义一样) )。

我从来没有特别担心我的类型比接口(interface)拥有更多的公共(public)成员,但我确实尝试注意该类型试图做什么(并留意它何时试图做太多事情) )。

所以我会回答说,审查一个类试图涵盖哪些职责并尝试将其最小化为一个是很好的做法,但我想说这种公共(public)成员比较不是相关的“代码味道”警报,在我的意见。

关于c# - 在类中添加不在接口(interface)定义中的公共(public)方法是一个好习惯吗?我什么时候应该这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26884936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com