- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在下面的示例中,我们有两个 Terrier
的实例类,派生自 Dog
.
一个实例被类型为 Terrier
的变量引用.
使用此变量,您可以访问 Terrier 类的所有成员。
另一方面,类型为 Dog
的变量只能引用 Dog
的成员类,即使引用指向 Terrier
的实例.
Terrier bubba = new Terrier("Bubba", 2, "Happy");
bubba.Growl(); // Can call Terrier.Growl
Dog jack = new Terrier("Jack", 17, "Surly");
jack.Growl(); // ERROR: Can't call Growl method
我需要实现一个类 MyPets
它有一个 List<Pets>
可以容纳 Cat
中的任何一个对象或 Dog
对象。
这两个对象都有一些常用方法,如 MakeNoise()
但也有一些不在基类中的独特方法,如 Cat 有方法 ClimbTree()
.
这MyPets
类还将有一个方法将遍历 List<animals>
并调用 MakeNoise()
方法和ClimbTree()
方法。
实现此目标的最佳方法是什么,使用抽象基类或其他方法?
最佳答案
关于我的评论,按照这些思路应该可以解决您的问题:
public class Visitor
{
public void doItterate(Cat c)
{
Console.WriteLine(c.ToString());
c.makeNoise();
c.climbTree();
}
public void doItterate(Dog d)
{
Console.WriteLine(d.ToString());
d.makeNoise();
}
}
public abstract class Pet
{
public Pet(string name, int age, Mood mood)
{
this.MoodOfPet = mood;
this.Name = name;
this.Age = age;
}
public string Name
{
get;
private set;
}
public int Age
{
get;
private set;
}
public Mood MoodOfPet
{
get;
private set;
}
public abstract void makeNoise();
public override string ToString()
{
return this.Name + " is " + this.Age +
" years old and feels " + this.MoodOfPet;
}
public abstract void accept(Visitor v);
}
public enum Mood
{
Surly,
Happy
}
public abstract class Dog : Pet
{
public Dog(string name, int age, Mood mood): base (name, age, mood)
{
}
public override void makeNoise()
{
Console.WriteLine(this.Name + " is woofing");
}
public override void accept(Visitor v)
{
v.doItterate(this);
}
}
public class SheepDog : Dog
{
public SheepDog(string name, int age, Mood mood): base (name, age, mood)
{
}
}
public class Cat : Pet
{
public Cat(string name, int age, Mood mood): base (name, age, mood)
{
}
public void climbTree()
{
Console.WriteLine(this.Name + " is climbing");
}
public override void makeNoise()
{
Console.WriteLine(this.Name + " is meowing");
}
public override void accept(Visitor v)
{
v.doItterate(this);
}
}
public class Terrier : Dog
{
public Terrier(string name, int age, Mood mood): base (name, age, mood)
{
}
public void growl()
{
Console.WriteLine(this.Name + " is growling");
}
public override void makeNoise()
{
growl();
}
}
public class MyPets
{
private Visitor visitor = new Visitor();
public MyPets()
{
Pets = new List<Pet>();
}
public List<Pet> Pets
{
get;
private set;
}
public void addPet(Pet p)
{
Pets.Add(p);
}
public void itterate()
{
foreach (Pet p in Pets)
{
p.accept(visitor);
}
}
}
这是标准的 OOP 设计,使用抽象方法,稍后在更具体的类中重载。
编辑现在它正在使用访问者模式
运行以下代码:
MyPets pets = new MyPets();
pets.addPet(new Cat("Bob", 2, Mood.Surly));
pets.addPet(new Terrier("Jack", 17, Mood.Surly));
pets.addPet(new SheepDog("Bubba", 2, Mood.Happy));
pets.itterate();
产生这些结果:
Bob is 2 years old and feels Surly
Bob is meowing
Bob is climbing
Jack is 17 years old and feels Surly
Jack is growling
Bubba is 2 years old and feels Happy
Bubba is woofing
关于c# - 具有许多通用和一些独特方法的类对象的设计方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37429199/
对于 Prometheus 指标集合,如标题,我真的找不到只能通过 type Summary 完成的用例。 ,似乎它们都可以通过 type Histogram 以某种方式完成还。 让我们以请求并发度量
这个问题在这里已经有了答案: Ignore case while using duplicated (1 个回答) 关闭 9 个月前。 使用不区分大小写的 unique(tolower(x)) 删除
应用程序监控服务的一个有用功能是每次发生新的、独特的错误/问题/异常时发送警报(例如电子邮件)(即不是每次发生)。要么只是第一次,要么最多每次 X 次(一天或一周等)。例如,这可以通过 Visual
应用程序监控服务的一个有用功能是每次发生新的、独特的错误/问题/异常时发送警报(例如电子邮件)(即不是每次发生)。要么只是第一次,要么最多每次 X 次(一天或一周等)。例如,这可以通过 Visual
我想要相当于 DB2 中 MySql 的 GROUP_CONCAT 功能。 我尝试过 DB2 的 XML Aggrigate 函数来合并 murows。 SELECT a.ID, sub
我正在运行 python 数据库迁移脚本 (Flask-Migrate) 并添加了 alembic.ddl.imp import DefaultImpl 来解决第一组错误,但现在我收到以下错误。我正在
我有一个逗号分隔的文件“myfile.csv”,其中第 5 列是日期/时间戳。 (mm/dd/yyyy hh:mm)。 我需要列出所有包含重复日期的行(有很多) 我正在通过 cygwin 为 WinX
我使用的是 MySQL 5.7。 我有一个表格如下: -------------------------------------------------- | id | currentcy_id |
所以我有一个像这样的 ng-repeat: Join Ride /md-switch> 但是,每个 md-switch 都有相同的模型,因此当我在 Control
据我了解, Mongoose 预保存 Hook 在将文档插入集合之前但在验证发生之后触发。因此,如果一次验证失败,则不会调用预保存 Hook 。 就我而言,无论如何都会调用它们: 下面的简单代码的作用
如果我对我的目标文件执行此 grep,我会得到例如 275 作为结果。 但是我想学习 awk,所以在 awk 中尝试了这个: awk 'BEGIN { count=0 } /my pattern/
我是一名优秀的程序员,十分优秀!