gpt4 book ai didi

c# - 如何编写一个可以由两个非继承类共享的方法

转载 作者:行者123 更新时间:2023-11-30 15:42:03 26 4
gpt4 key购买 nike

我有 2 个类,都有相同的方法(名称 + 类型 + 行为)和相同的属性(名称 + 类型)

public class Country
{
public string Name { get; set; }

public void DisplayName()
{
Console.WriteLine(this.Name);
}
}

public class Person
{
public string Name { get; set; }

public void DisplayName()
{
Console.WriteLine(this.Name);
}
}

-- PersonCountry 类不允许继承

在上面的代码中你可以看到Person 类和Country 类有相似的方法(DisplayName)。我正在寻找一种方法,使两个类可以共享相同的方法代码,我想这样做是因为在我的真实代码中——我想共享的方法非常大,每当我在一个类中更改代码时,我都必须复制粘贴它也在其他类(class)。我觉得这不是正确的方法。

请建议如何解决此问题。

最佳答案

你说他们不能从公共(public)基类继承,但你可以添加一个接口(interface),对吧?我建议给他们每个人一个共同的接口(interface)。然后定义一个 extension method 该接口(interface)。该方法将出现在 VS 中。

(假设:如果扩展方法访问的类成员是公共(public)的或内部的,这将起作用。)

interface IDisplayable
{
string Name {get; set;}
}

public class Country : IDisplayable
{
public string Name { get; set; }
}

public class Person : IDisplayable
{
public string Name { get; set; }
}

public static void DisplayName(this iDisplayable d)
{
return doSomeDisplayLogic(d.Name);
}

. . .在与您的扩展方法相同的类中,定义(不是作为扩展方法)一个函数 doSomeDisplayLogic 来执行您的通用逻辑。 (第一次遇到问题:确保扩展方法在同一个命名空间中,或者它的命名空间也包含在调用代码中。)

我不知道您是否是扩展方法的新手。他们非常强大。 (和许多强大的功能一样,它们可能会被滥用)。一个extension method on an interface一开始看起来很疯狂,直到你明白扩展方法是如何工作的。没有这个,LINQ 将无法工作!

更新:我看到你上面的评论说这些类不能从一个公共(public)类继承,因为它们已经从一个公共(public)类继承了(我认为不能被太多搞乱).我想指出一个选项 2,基于此:创建一个新类,国家/人/等。将继承自,它本身继承自现有的公共(public)父类。可以说,现有的基类将成为祖父 类。如果 CountryPerson 除了此 DisplayName 方法之外还有其他共同特征,这将成为更可行的方法。如果您只需要 DisplayName,那么接口(interface)/扩展模式可能会更好。

关于c# - 如何编写一个可以由两个非继承类共享的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7795455/

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